- 此问题在此处已有答案**:
How do I convert an existing callback API to promises?(24个答案)
5小时前关门了。
我正在尝试在我的网站上设置身份验证和帐户创建页面(没什么太复杂的,只是开始使用express和SQLite)。我的问题是我的添加用户的功能(或连接)在与数据库交互的不同步骤上具有回调,而且我想等它们全部完成后再结束函数,这样我就可以通过express响应把数据传回前面了。该数据将包括数据库中的任何错误代码(用户已经存在)和当有人连接时的实际用户数据。
function addUser(username,password)
{
var db = new sqlite3.Database('./database/users.db',sqlite3.OPEN_READWRITE, (err) => {
if (err) {
console.error("open error code : "+err.errno+" ; msg : "+err.message);
}
});
var statement=db.prepare("INSERT into users(username,password) VALUES(?,?)")
statement.run(username,password,(err)=>{
if (err) {
console.error("run error code : "+err.errno+" ; msg : "+err.message);
}
});
statement.finalize((err)=>{
if(err)
{
console.error("finalize error code : "+err.errno+" ; msg : "+err.message);
}
})
db.close()
}
理想情况下,服务器的答案应该如下所示
app.post('/addUser',jsonParser,(req,res)=>{
res.status(200).send(JSON.stringify({error : addUser(req.body.username,req.body.password)}))
});
其中addUser返回在其步骤中生成的任何err.errno(当前没有)。
我尝试过声明一个变量来存储错误(类似地,也可以存储connectAsUser(username,password)函数的用户数据),但是addUser(username,password)的线程会在回调err之前完成。我也尝试过promises,但是我很快就陷入了混乱的范围。
编辑:我设法找到了一个解决办法,玩弄承诺,然后()。
功能代码:
async function addUser(username,password)
{
var resp = {
openError : "",
runError : "",
finalizeError : ""
}
var data = {
db : null,
statement : null,
}
var promisedDB = new Promise((resolve,reject)=>{
var db = new sqlite3.Database('./database/users.db',sqlite3.OPEN_READWRITE, (err) => {
if (err) {
resp.openError=err.errno
reject()
}
else
{
data.db=db
resolve()
}
});
})
await promisedDB.then(_=>{
return new Promise((resolve,reject)=>{
var statement=data.db.prepare("INSERT into users(username,password) VALUES(?,?)")
statement.run(username,password,(err)=>{
if (err) {
resp.runError=err.errno
reject(err)
}
else
{
data.statement=statement
resolve()
}
})
})
}).then(_=>
{
return new Promise((resolve,reject)=>{
data.statement.finalize((err)=>{
if(err)
{
resp.finalizeError=err.errno
reject(err)
}
else
{
resolve()
}
})
})
}).then(_=>{
data.db.close()
}).catch(err=>{
console.log(err)
})
return resp
}
并且来自服务器的回答是:
app.post('/addUser',jsonParser,(req,res)=>{
addUser(req.body.username,req.body.password).then((value)=>{
console.log(value)
res.status(200).send(JSON.stringify(value))
})
});
我已经运行了一些测试,必须在addUser()函数中使用data {}这样的对象,才能在整个代码中编辑变量(就像在其他语言中传递引用/地址一样)。
2条答案
按热度按时间brgchamk1#
也许试试
或
或
或
或
或RxJS库测试
第一个锁在它驻留的函数中锁定下面的代码,第二个不在
then
中等待-----编辑
所有需要的东西都可以在这里找到https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve.这是在概述标签中.这些是js的基础.
8mmmxcuj2#
sqlite3节点模块概述
sqlite3模块为Node应用程序提供与SQLite数据库通信的函数。
数据库对象
sqlite3模块是**/database/db.js所必需的,**指定显示详细错误。
然后使用上面初始化的数据库**/database/db. sqlite创建一个新的数据库对象。**
导出此对象(可用于需要此对象的其他脚本)。
使用数据库对象需要数据库对象的唯一脚本是数据模型
/models/data-model.js.
此对象的方法可以使用
db.function()
运行。函数中的用法示例例如,
Database.run()
函数对数据库执行SQL命令,但不返回任何行。run()函数的语法是:
在这个应用程序中,run()命令用于
createRow()
和deleteRow()
数据模型函数,它们充当单个db.run()
调用的 Package 函数。createRow()
函数有两个参数:数据库中表的名称和回调函数。请访问这个网站查看更多关于连接和如何处理link的详细信息