Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点/快速函数和回调未因返回而中断_Node.js_Mongodb_Rest_Express_Mongoose - Fatal编程技术网

Node.js 节点/快速函数和回调未因返回而中断

Node.js 节点/快速函数和回调未因返回而中断,node.js,mongodb,rest,express,mongoose,Node.js,Mongodb,Rest,Express,Mongoose,我正在节点中创建一个“刷新数据”函数,无法确定回调和返回的位置。该函数将继续运行。下面是函数应该做的事情的列表。有人能帮忙吗 检查用户在本地MongoDB中是否具有api id 使用POST调用REST api以接收令牌 将令牌存储在MongoDB中 终止函数 ./routes/index.js router.post('/refresh', function(req, res) { var refresh = require('../api/refresh'); refresh

我正在节点中创建一个“刷新数据”函数,无法确定回调和返回的位置。该函数将继续运行。下面是函数应该做的事情的列表。有人能帮忙吗

  • 检查用户在本地MongoDB中是否具有api id
  • 使用POST调用REST api以接收令牌
  • 将令牌存储在MongoDB中
  • 终止函数
  • ./routes/index.js

    router.post('/refresh', function(req, res) {
        var refresh = require('../api/refresh');
        refresh(req, function() { return console.log('Done'); });
    });
    
    ../api/refresh.js

    var callToken = require('./calltoken');
    var User = require('../models/user'); // Mongoose Schema
    
    module.exports = function(req, callback) {
      User.findOne( {'username':req.body.username}, function(err, user) {
        if(err) { console.log(err) }
        if (user.api_id == 0) {
          callToken.postToken(req.body.username, callback);
        } else { // Do something else }
      });
    };
    
    /calltoken.js

    var request = require('request');
    var Token = require('../models/token');  // Mongoose Schema
    
    module.exports = {
    
      postToken: function(user, callback) {
        var send = {method:'POST', url:'address', formData:{name:user} };
        request(send, function(err, res, body) {
          if(err) { console.log(err) }
          if (res.statusCode == 201) { 
            var newToken = new Token();
            newToken.token = JSON.parse(body).access_token['token'];
            newToken.save(function(err) {
              if(err) { console.log(err) }
              return callback();
            });
          }
        });
      }
    };
    

    我不是Express方面的专家,但在您的任何地方,代码都与
    if(err){console.log(err)}
    保持一致,您应该停止执行(当然可能不取决于您的应用程序),并将400或500返回给客户端。所以它可以是这样的

    if(err) { 
      console.log(err);
      return callback(err);  // NOTICE return here
    }
    

    成功执行后,应调用
    返回回调(null,result)
    。请注意,第一个参数为null-这符合nodejs约定(错误总是作为第一个参数出现)。

    因此,如果
    res.statusCode
    不是预期的结果,何时调用回调并允许继续执行?另外,使用
    request()
    调用在作用域中过度加载
    res
    也是一种不好的做法。
    res
    req
    都是端点请求的计分变量,即使您现在正在“测试”,您也会希望使用该范围内的
    res
    向客户端返回“响应”。Blakes,感谢您的快速响应。我删除了res.statusCode的else语句!=201以简化过帐,但如果出现这种情况,将返回一个错误,并停止函数,不再进行回调。我希望刷新数据和错误检查的过程在使用多个分支完成后,每个步骤都会非常长。此外,我将确保避免覆盖res,并将使用res和req仅用于与客户端通信。感谢您的帮助。Blakes,该问题已通过async.series解决。为了简化,我将代码整合到路由中的./routes/index.js文件中。谢谢你早些时候的帮助和建议。谢尔盖,非常感谢。我已将此特定路由更改为使用async.series。也就是说,您的回答帮助我理解了如何恰当地使用return和callback。尽管我阅读和回顾了许多例子,但我还是很难理解这个话题。非常感谢!