简体   繁体   English

使用Node.js Express从改造中提取@Field参数

[英]Extracting the @Field parameter from retrofit with Node.js Express

I am trying to make an app in Android and have some problem. 我试图在Android中制作一个应用程序,但遇到了一些问题。 I have searched the web but I haven't found an obvious solution. 我已经在网上搜索过,但是没有找到明显的解决方案。

In my Android app I send a Post request for a login task using Retrofit. 在我的Android应用中,我使用Retrofit发送发布请求以请求登录任务。

@FormUrlEncoded
@POST("/login")
Call<Boolean> loginUser(@Field("username") String userName, @Field("password") String password);

My server is in Node.js with express and I don't know how to extract the username and password parameters. 我的服务器位于带有express的Node.js中,我不知道如何提取用户名和密码参数。

my app.js file looks like this: 我的app.js文件如下所示:

var http = require('http');
var express = require('express');
var bodyparser = require('body-parser');

var connection = require('./dbConnection');

var app = express();
require('./models')(app);
require('./controllers')(app);
require('./routes')(app);

app.use(bodyparser.urlencoded({extended: true}));
app.use(bodyparser.json());

connection.init();

var server = app.listen(3000, function() {
    console.log('Server listening on port ' + server.address().port);
});

And my routes file for login looks like this: 我的登录路线文件如下所示:

var loginM = require('../models/login');
var loginC = require('../controllers/login');

module.exports = function(app) {

    app.post('/login/', function(req, res, next) {
        loginM.attemptLogin(req.body, res);
    });
}

req.body does not seem to give me the @Field variables, I have tried req.headers and req.params as well with no success. req.body似乎没有给我@Field变量,我也尝试了req.headers和req.params,但均未成功。 Can someone explain how to extract them? 有人可以解释如何提取它们吗?

Much appreciated 非常感激

On NodeJs side, or better: expressjs app side, you need to use a body-parser middleware, such as https://github.com/expressjs/body-parser 在NodeJs端或更好的方面: expressjs app端,您需要使用body-parser中间件,例如https://github.com/expressjs/body-parser

npm install body-parser --save

Since body-parser supports JSON as well as URL encoded input (which retrofit @Field generates) you need to add appropriate middleware functions to app: 由于body-parser支持JSON以及URL编码的输入( @Field进行了改造),因此您需要向app添加适当的中间件功能:

var bodyParser = require('body-parser');

// parse JSON inputs
app.use(bodyParser.json());

// Also, parse URL encoded inputs
app.use(bodyParser.urlencoded());

// handle requests
app.post('/login/', function(req, res, next) {
   loginM.attemptLogin(req.body, res);
});

Also , remember that you add body-parser middleware Before adding routes/controllers to the app. 另外 ,请记住, 向应用程序添加路由/控制器之前 ,先添加body-parser中间件。 Because parser middleware should be executed before so that input is parsed by the time request handling logic is executed. 因为解析器中间件应该在执行之前执行,以便在执行请求处理逻辑时对输入进行解析。

var app = express();

// first
app.use(bodyparser.urlencoded({extended: true}));
app.use(bodyparser.json());

// after
require('./models')(app);
require('./controllers')(app);
require('./routes')(app);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM