Node.js body.req未使用bodyparser接收POST参数事件。它不是在浏览器中工作,而是在邮递员中工作

Node.js body.req未使用bodyparser接收POST参数事件。它不是在浏览器中工作,而是在邮递员中工作,node.js,express,ionic-framework,Node.js,Express,Ionic Framework,节点控制器 SERVER.js var express=require("express"); var app=express(); var bodyParser=require("body-parser"); var expressJWT=require("express-jwt"); var jwt=require("jsonwebtoken"); var morgan=require("morgan"); var methodOverride=require("method-overri

节点控制器

SERVER.js

var express=require("express");
var app=express();
var bodyParser=require("body-parser");
var expressJWT=require("express-jwt");
var jwt=require("jsonwebtoken");
var morgan=require("morgan");
var methodOverride=require("method-override");
var passport=require("passport");

require("./config/database");
require("./config/passport");

app.use(passport.initialize());
app.use(morgan("dev"));
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());
app.use(bodyParser.json({type:"application/json"}));
app.use(methodOverride());

app.use(function(err,req,res,next){
  if(err)
    console.log(err);
  next();
});

app.use(function(err,req,res,next){
      res.setHeader("Access-Control-Allow-Origin","http://localhost:8080");
      res.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS, PUT, PATCH, DELETE");
    res.setHeader('Access-Control-Allow-Credentials', true);
    next();
});

var routes=require("./config/routes");
routes(app,passport);

require("./config/passport")(passport);
app.listen(8080,function(err,connection){
    console.log("App listening on port 8080");
});
发出请求的angularjs控制器

var User=require("./../models/user");
var Token=require("./../shared/getToken");
var jwt=require("jwt-simple");
var config=require('./../../config/database');

module.exports={
    signup:signup,
    authenticate:authenticate,
    memberinfo:memberinfo
};



function authenticate(req,res){
    // if(err)
    //  console.log(err);
    console.log("in authenticate",req.body);
    if(!req.body.username || !req.body.password)
    {
        res.json({success: false,msg: 'Blank username or password '});
    }
    else
    {
        User.findOne({username: req.body.username},function(err,user)
        {
            if(err)
            {
                console.log('2');
                throw err;
            }
            if(!user)
            {
                console.log('3');
                return res.status(403).send({success: false,msg: 'Authentication failed.User not found'});
            }
            else
            {
                console.log('4');
                user.comparePassword(req.body.password,function(err,isMatch)
                {
                    if(isMatch && !err)
                    {
                        var token=jwt.encode(user,config.secret);
                        res.json({success: true,token: 'JWT '+token});
                    }
                    else
                    {
                        return res.status(403).send({success: false,msg: 'Authentication failed.Wrong Password'});
                    }

                });
            }   
        });
    }
}
我试图创建一个简单的移动应用程序使用离子框架与平均堆栈。但是我从3天开始就面临这个问题。我无法找到解决方案。问题是:
当我请求使用参数{“username”:“something”,“password”:“something”}进行身份验证时,authenticate函数中的req.body是{}。主体解析器已在服务器中运行。但这在邮递员中运行良好,但在浏览器中不起作用。怎么办?

1-您正在解析正文两次。您应该删除一个
bodyParser.json
中间件

2-发送请求之前,应序列化数据(user=myuser&password=mypassword):

使用
jQuery.param

var seralize = function serialize (obj) { 
    return Object.keys(obj).map(function(key) {
        return key + '=' + encodeURIComponent(obj[key]);
    }).join('&');
}

$http.post(url, seralize(user), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } })
使用:

或者,您可以让
$http
将数据序列化为JSON,从请求中删除标题。默认情况下,
$http
服务将通过将数据序列化为JSON,然后使用内容类型“application/JSON”发布来转换传出请求:


您应该查看Chrome调试器的“网络”选项卡,查看Javascript代码发送到服务器的确切内容。可能,它发送的内容与使用Postman时不同,因此它不是服务器所期望的。我看到了。浏览器正在发送有效负载。
var seralize = function serialize (obj) { 
    return Object.keys(obj).map(function(key) {
        return key + '=' + encodeURIComponent(obj[key]);
    }).join('&');
}

$http.post(url, seralize(user), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } })
var data = $.param({
                user: user.username,
                password: user.password
            });

$http.post(url, data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } })
$http.post(url, $httpParamSerializerJQLike(data), {headers: { 'Content-Type': 'application/x-www-form-urlencoded'} })
$http({
    method: 'POST',
    url: url,
    data: user
});