javascript - NodeJS 在函数完成之前响应

标签 javascript node.js rest express mongoose

我正在为一个学校项目使用 NodeJS 和 Express 编写一个 API,但我正在努力解决以下问题:

函数 getAuthUserId 解码 JWT token 并从 mongoDB 服务器中的用户获取 Id。

我在 REST 调用“/user/authTest”中调用此函数。但是当我调用它时,服务器在数据库返回 Id 之前做出响应,并且变量 UId 未定义。正如您所看到的,实际上找到了 Id。关于如何解决这个问题有什么想法吗?

API调用代码:

apiRoutes.post('/user/authTestID', function(req, res) {
  var UId = getAuthUserId(req, res);
  console.log(UId);
  if (UId) {
    res.sendStatus(200);
  }else{
    res.sendStatus(400);
  }

}); 

功能:

function getAuthUserId(req, res) {
    var user = new User();
  var token = user.getToken(req.headers);
  if (token) {
    var decoded = jwt.decode(token, config.secret);
    User.findOne({
      name: decoded.name
    }, function(err, user) {
        if (err) throw err;

        if (!user) {
          res.status(403).send({success: false, msg: 'Authentication failed. User not found.'});
          return false
        } else {
          console.log('Auth for ' + user.name + ' ' + user._id);
          return user._id
        }
    });
  } else {
    res.status(403).send({success: false, msg: 'No token provided.'});
    return '';
  }
}

终端的输出:

[nodemon] restarting due to changes...
[nodemon] starting `node server.js`
Connected to MongoDB
undefined
::ffff:192.168.0.111 - POST /user/authTestID HTTP/1.1 400 11 - 175.006 ms
Auth for test 58f8954c3602b80552b6f1fb

提前致谢!

最佳答案

你需要做出 promise ,就像这样。

API

apiRoutes.post('/user/authTestID', function(req, res) {
  getAuthUserId(req, res).then(function (UId) => {
    console.log(UId);

    if (UId) {
      res.sendStatus(200);
    }else{
      res.sendStatus(400);
    }
  });

}, function(err) {
    console.log(err.msg)
    res.status(err.status).send(err.msg);
});

函数

function getAuthUserId(req, res) {
    return new Promise(function(resolve, reject){
        var user = new User();
        var token = user.getToken(req.headers);
        if (token) {
            var decoded = jwt.decode(token, config.secret);
            User.findOne({
                name: decoded.name
            }, function(err, user) {
                if (err) throw err;

                if (!user) {
                    reject({status: 403, msg: 'Authentication failed. User not found.'});
                } else {
                    console.log('Auth for ' + user.name + ' ' + user._id);
                    resolve(user._id)
                }
            });
        } else {
            reject({status: 403, msg: 'No token provided.'});
        }
    })
}

关于javascript - NodeJS 在函数完成之前响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43741065/

相关文章:

javascript - 将2个数组组合成一个多维数组?

javascript - jQuery UI Datepicker - 月份和年份下拉菜单

node.js - 将 React 应用程序部署到 Google App Engine 时出现 502 服务器错误

javascript - 在使用 jQuery 追加到列表之前检查重复的 div

javascript - fs readFilesync 错误路径必须是字符串

node.js - HEROKU 和 HAPIJS 错误 R10(启动超时)-> Web 进程在启动后 60 秒内无法绑定(bind)到 $PORT

Java Spring rest java.lang.ClassCastException : java. util.LinkedHashMap 无法转换为 Cuestionario

java - RESTful Spring MVC 是否可以重复参数?

java - 如何获得对改造异常的响应体?

asp.net - 如何获取服务器端var值?