【发布时间】:2018-03-28 18:27:10
【问题描述】:
我是 Node 新手,从来没有做过很多前端 Web 开发或 Javascript,但我正在尝试做一些简单的前端任务,但我看到了我不理解的错误。我已经阅读了许多关于我所看到的错误的帖子,但很多都没有接受答案,还有一些似乎无关。我还多次阅读了 David Herron 的 Node.js Web 开发一书中关于 Promise 的部分,所以我认为我理解 Promise 背后的想法,但我对我看到的一些错误感到困惑。
我正在运行 express.js 服务器。我在文件 query.js 中有一个查询方法,它(简化)接受一个键并返回一个值,如下所示:
'use strict'
function query(key) {
return Promise.resolve().then(() => {
// ... lots of stuff and more '.then' things
}).then((arg) => {
return arg[0] // this is always a string
}
module.export.query = query
然后我有一个 server.js 文件,其中包含快速服务器的代码。 一种方法有效,一种方法无效,我不知道有什么区别。这是按预期工作的方式:
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
var q = require('./query.js')
app.use(express.static('public'))
app.use(bodyParser.urlencoded({ extended: false}))
app.post('/path', function (req, res) {
q.query(req.body.param).then(console.log).catch((err) => {
console.error("My Error:", err)
}
res.send("arbitrary string")
})
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})
当我使用 param='key' 发送 post 请求时,它会正确地将 'value' 输出到控制台并将“任意字符串”发送回客户端。但是,如果我尝试将 res.send 作为 '.then' 事物的参数以便将检索到的值返回给客户端,则会出现错误。因此,如果我将 app.post 更改为:
app.post('/path', function (req, res) {
q.query(req.body.param).then(res.send).catch((err) => {
console.error("My Error:", err)
}
})
我明白了
My Error: TypeError: Cannot read property 'req' of undefined
at send (/home/u/NodeServer/node/myapp/node_modules/express/lib/response.js:110:17)
有谁知道为什么一个 console.log(它接受一个字符串作为参数)会工作,而 res.send(它也接受一个字符串作为参数)不会?我觉得这很奇怪,尤其是 res.send 只能在 promise 结构之外工作,而 console.log 可以在任何地方工作。
【问题讨论】:
-
第 110:17 行的内容
-
提示:该问题与
this有关。您正在传递该方法,但您丢失了要应用该方法的对象。使用调用res.send的函数,或使用apply。 -
深入到 express.js 库中,它位于 res.send 定义的顶部 (res.send = function send(body) { var chunk = body; var encoding; var req = this .req; ...
-
q.query(req.body.param)返回的承诺是什么?什么类型的价值?目的?细绳?数字?因为如果它是您想要发回给您的客户的对象,那么q.query(req.body.param).then(res.send.bind(res))应该可以工作。 -
@jfriend00 承诺应始终解析为字符串。