我是Postgres和Promise的新手,我在无法使用express的课程中这样做。我有一台允许与Heroku节点pg-promise数据库进行交互的服务器。我正在尝试通过发布请求插入数据,而在此过程中,插入数据库后,我无法使端点返回结果查询。
这是我的终点:
var server = http.createServer(function(req, res){
let uri = url.parse(req.url, true)
switch(uri.pathname){
case '/':
sendFile(res, 'public/index.html')
break
case '/index.html':
sendFile(res, 'public/index.html')
break
case '/getRows':
getRows().then((rows) => {
res.end(JSON.stringify(rows))
})
break
case '/addRow':
console.log("adding row")
addRow(req).then((rows) => {
console.log('adding: ' + JSON.stringify(rows))
console.log('\nadding: ' + rows.id)
res.end(JSON.stringify(rows))
})
.catch(e =>{
console.log(e.stack)
return {'status': 'failure', 'message': e.stack}
})
break
default:
console.log("default path")
res.end('404 not found')
}
这是数据库函数:
async function getRows(){
try{
return await db.any('SELECT * from grades')
} catch(e){
console.log(e.stack)
}}
async function addRow(req){
let body = []
req.on('data', (chunk) => {
body.push(chunk)
}).on('end', () => {
body = Buffer.concat(body).toString()
return process(JSON.parse(body))
})
async function process(obj) {
console.log("before generating id")
let id = generateId()
return await db.one('INSERT INTO grades VALUES($1, $2, $3, $4) RETURNING *',
[id, obj.student, obj.item, obj.grade])
}}
“ RETURNING *”应该返回我插入的行,但是我的console.logs告诉我/ addRow端点中的“ rows”对象是未定义的,或者如果我尝试访问'id',它将返回未定义的。 / getRows端点正常工作,甚至显示插入的行。如何获取/ addRow端点以返回添加的行?我的理解是.then()是查询返回时的回调,它甚至适用于getRows,所以为什么它不适用于此查询?
编辑:我认为这与以下事实有关:当我完成对请求体的处理时,我不会在匿名函数中返回“ await process(...)”。我尝试使该异步并返回await process(),但仍然出现相同的错误。