【问题标题】:Node.js on Openshift gives error 400 but works properly on local machineOpenshift 上的 Node.js 给出错误 400,但在本地机器上正常工作
【发布时间】:2016-01-11 17:38:49
【问题描述】:

我的基于 Node + MongoDB 的 REST API 在本地 Node 服务器上运行良好,并返回正确的输出。但是Express(可能!)在 Openshift 上部署时返回错误400 Bad Request。 知道如何调试应用程序吗?我尝试将一些 console.log 语句放在有问题的方法中,但即使是那些也没有被调用。

顺便说一句,一些示例代码:

app.js:

var express = require('express');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var app = express();

var userController = require('./Controllers/user');
var authController = require('./Controllers/auth');
mongoose.connect(process.env.OPENSHIFT_MONGODB_DB_URL + 'dbname');
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());
app.use(function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With , content-type, Authorization ,x-access-token ,' +
    'x-auth-email ,x-auth-password');
next();
});

app.post('/signin',authController.authorize,userController.signin);

控制器/auth.js:

var passport = require('passport');
var User = require('../Models/user');
var LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(function(email,password,callback) {
console.log('passport called');
User.findOne({email:email},function(err, user){
    console.log('email at passport: ' + email);
    if(err){
       return callback(err);}


   if(!user){return callback(null,false);}

    user.matchPassword(password,function(err,isMatch){
        if(err){return callback(err);}

        if(!isMatch){return callback(null,false);}

        console.log('isMatch: ' + isMatch);
        return callback(null,user);
      });
    });
 }));

 exports.authorize = passport.authenticate('local', { session : false });

控制器/user.js:

 var User = require('../Models/user');
 var jwt = require('jsonwebtoken');
 exports.signin = signin= function (req,res){
User.findOne({email:req.body.email},function(err, user){
    if(err){res.send(err);}


    console.log(user);
        user.token = jwt.sign(user.password, 'SECRET_KEY');
        user.save(function (err,user) {
            if (err) {
                res.send(err);
            }
            res.json({email:user.email,token:user.token});
        })
});
};

在 Postman 中使用 POST 调用 signin 路由会在本地服务器中返回预期的 json 数据,但在 Openshift 上部署时返回 HTTP 400 Bad Request。我什至尝试将 express 降级到 Openshift 上的版本,但问题仍然存在。

【问题讨论】:

  • 您在 OpenShift 上的日志文件中是否有任何可以提供的信息?
  • 应用程序正常运行。任何日志文件都没有输出。发送错误后应用程序不会终止。
  • 代码?没有上下文就无法回答您的问题。
  • 如果需要,我可以将链接发布到整个仓库。但这意味着您必须设置本地 Node + Mongo 并将测试数据添加到数据库。它只是一个简单的app.post() 不起作用。
  • @BenRondeau 我添加了一些代码。如您所见,我在各个地方添加了console.log() 语句。发出请求时,它们都不会被打印出来。

标签: node.js openshift


【解决方案1】:

解决了!显然,passport.js 是罪魁祸首。 Passport 在我经过 (email,password,function()) 时占用 (username,password,function())

最终代码 auth.js:

 passport.use(new LocalStrategy({usernameField: 'email',
                            passwordField: 'password'},
      (function(username,password,callback) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    相关资源
    最近更新 更多