控制器无法将响应传递给 index.js

Sin*_*ngh 5 node.js express

我是新来的。针对类似问题发布了几个解决方案,但没有一个有帮助。我在下面发布了一个非常简单的玩具示例,可以帮助您进行调试。

索引.js

const express = require('express')
port=3001

var controller = require('./controller');
app.use('/api', controller);
Run Code Online (Sandbox Code Playgroud)

控制器.js

var model = require('./model')
var router = express.Router();

router.get('/bl', function(req, res) { 
    model.getData( function (err, objects) {
        if(err) return res.send(err);
        return res.status(200).json(objects);
    });
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

模型.js

const bl = {"hello":"world"}
const getData= (request, response) => {
    return(bl);
  }

module.exports = {
  getData
}
Run Code Online (Sandbox Code Playgroud)

问题:调用:http://localhost:3001/api/bl => 无响应,控制台:无错误

笔记:

在我的model.js 中,我在Postgres 数据库中查询,我可以在console.log 中看到结果。

但是当我尝试在 controller.js 中使用 console.log 查看数据时,我没有看到任何这样的结果。我在上面的玩具示例中观察到的类似行为

Ifa*_*uki 2

您需要第三个参数,您通常会看到callback或只是cb在函数中执行它并向其传递一些数据。第一个参数false将是稍后的错误参数,bl并将是objects传递的参数

const getData= (request, response, callback) => {
    callback(false, bl);
  }
Run Code Online (Sandbox Code Playgroud)

然后将参数传递reqres它:

model.getData(req, res, function (err, objects) {
    if(err) return res.send(err);
    return res.status(200).json(objects);
});
Run Code Online (Sandbox Code Playgroud)

或者用现代的方式与async / await你一起做这件事可以返回一个承诺

const getData= (request, response) => {
   return new Promise((resolve, reject) => {
      if(someErrorAppear){
         reject("some error occured");
      }
      resolve(bl);
   })
}
Run Code Online (Sandbox Code Playgroud)

现在你可以去async / await

router.get('/bl', async function(req, res) { 
    try {
       let objects = await model.getData(req, res);
       res.status(200).json(objects);
    }catch(err){
       res.send(err);
    }  
    });
});
Run Code Online (Sandbox Code Playgroud)