Javascript 过期连接之外的松动请求
我正在尝试执行以下查询,但收到此错误: 过期连接之外的松动请求 查询实际上成功了,但即使如此,我还是希望消除错误消息 pg承诺查询Javascript 过期连接之外的松动请求,javascript,sql,node.js,postgresql,pg-promise,Javascript,Sql,Node.js,Postgresql,Pg Promise,我正在尝试执行以下查询,但收到此错误: 过期连接之外的松动请求 查询实际上成功了,但即使如此,我还是希望消除错误消息 pg承诺查询 db.task(t => { t.oneOrNone(queries.insertUser, [profile.id]) .then(id =>{ if (id) { t.none(queries.insertUserGoogle, [ p
db.task(t => {
t.oneOrNone(queries.insertUser, [profile.id])
.then(id =>{
if (id) {
t.none(queries.insertUserGoogle, [
profile.id,
profile.emails[0].value,
profile.name.givenName,
profile.name.familyName,
profile.displayName
])
}})
.catch(err => console.log(err))
SQL
const insertUser = `INSERT INTO users (google_id)
VALUES ($1)
ON CONFLICT (google_id) DO NOTHING
RETURNING user_id`;
const insertUserGoogle = `INSERT INTO users_google (google_id, email, first_name, last_name, display_name)
VALUES ($1, $2, $3, $4, $5)`;
我是这本书的作者
您无法链接查询方法返回的承诺,而查询方法又在任务上下文之外执行这些承诺,从而导致该错误 以下是正确的方法:
db.task(t => {
return t.oneOrNone(queries.insertUser, [profile.id])
.then(id => {
if (id) {
return t.none(queries.insertUserGoogle, [values])
}
})
})
.catch(err => {
console.log(err);
});
承诺必须始终被链接起来。在任务的上下文中,它们必须链接到任务
如果不这样做,将导致松散的承诺,并且在数据库任务的上下文中—在任务完成并释放其连接后尝试执行的松散查询请求
另外,一个好方法是在任务结果上使用.catch
,如图所示,而不是在任务内部使用
其他提示
- 由于任务中的两个查询都是insert,如果您关心数据的完整性,那么您可能应该使用方法进行事务,而不是
- 它使得将SQL存储在外部文件中并作为替代文件访问这些文件的代码更干净、更高效。另见:
db.task(function* (t) {
const id = yield t.oneOrNone(queries.insertUser, [profile.id]);
if (id) {
yield t.none(queries.insertUserGoogle, [values]);
}
})
.catch(err => {
console.log(err);
});
…您只会将任务的结果链接起来
更新
在版本中,错误消息被重构为
查询已释放或丢失的连接
谢谢!这非常有帮助。@Matt不客气,请参阅更新部分;)