gpt4 book ai didi

node.js - Controller 无法将响应传递给 index.js

转载 作者:行者123 更新时间:2023-12-03 12:12:13 27 4
gpt4 key购买 nike

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

index.js

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

var controller = require('./controller');
app.use('/api', controller);

Controller .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;

模型.js

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

module.exports = {
getData
}

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

笔记:

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

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

最佳答案

我可以看到一个错误和一些让我担心的事情。

错误在于以下两行

// In controller.js
model.getData( function (err, objects) {

// In models.js
const getData= (request, response) => {

您定义了一个接受两个参数的函数 (request, response) (它们都是对象),而不是你称之为只传递一个函数类型的参数。

让我担心的是 getData功能本身。
const bl = {"hello":"world"}
const getData= (request, response) => {
return(bl);
}

除了参数,它是一个同步功能,但在你的问题中你指出在models.js中你在Postgres数据库中查询,你可以在console.log中看到结果;现在您没有向我们提供有关如何查询 Postgress 的详细信息,但我想您正在使用异步操作(可能是 pg )。您没有透露的其他相关细节是您是否在 getData 函数体内部或外部查询 Postgress。我希望我错了,但是由于在您的示例中,您要返回在函数体之外定义的内容,因此我对此表示怀疑。

让我们只考虑一个好的选项,您在函数体内查询 Postgress,您的完整 getData 函数可能如下所示。
const getData = (request, response) => {
client.query('SELECT $1::text as message', ['Hello world!'], (err, res) => {
// Here you get your message in console
console.log(err ? err.stack : res.rows[0].message);
client.end();
})

return something;
// I don't know what, but fore sure something wrong
}

要解决这两个问题,您只需要修复 getData(偶然或通过剪切和粘贴,您在 controller.js 中以正确的方式调用它)。

让我们开始修复它的签名,让它只接受一个参数:回调函数:
const getData = (done) => {

然后让我们通过 done 异步“返回”我们从 Postgress 获得的数据。回调函数。
const getData = (done) => {
client.query('SELECT $1::text as message', ['Hello world!'], (err, res) => {
// We can leave this for debugging purposes
console.log(err ? err.stack : res.rows[0].message);
// Here we are not handling errors from client.end()...
// but we can neglect about this right now
client.end();
// Let's calle the callback function passing it the result
done(err, res);
})

// There's nothing to return
}

应该够了。

希望这可以帮助。

关于node.js - Controller 无法将响应传递给 index.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62241222/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com