Nodejs异步可重用函数调用
Nodejs Asynchronous reusable function call
我在开发自己的 Node.JS 应用程序时遇到了一些问题。我是这种代码架构的新手,对异步也不是很好。
目前我的 index.js 脚本中有一个事件,需要另一个脚本 database.js。此数据库脚本将处理我的应用程序中的每个数据库调用。
index.js
const db = require('database.js');
//Called when a userjoin the application, this is working well//
db.userJoinedFunction("username");
我正计划在 "userjoinedFunction" 中添加其他函数调用。例如:首先建立数据库连接 --> 第二次检查用户是否已经在数据库中 --> 3d 如果没有,则创建用户条目 --> 4 如果是,请返回欢迎消息。
由于我必须多次建立数据库连接,所以我想在这些函数中重用一些代码,如下所示:
database.js
module.exports.userJoinedFuntion = userJoinedFunction
function userjoinedFunction(username){
Init_database_connection();
if(UserAlreadySignedup(username)){
WelcomeMessage(username);
}
else {
AddUserToDatabase(username);
}
}
但显然我做错了,因为异步 Node.js 应用程序不可能那么简单...我怎样才能拥有那种类型的可重用架构?你有我可以阅读的有关该主题的文章吗?
非常感谢您的帮助!
编辑 29/05/2019
在 novomanish 的回应下,我尝试了这个:
async fonction run(){
await(call("number 1");
await Init_database_connection();
await(call("number 2");
}
async function call(text){
console.log(text);
}
async function Init_database_connection(){
db = new sqlite3.Database("path", sqlite.OPEN_READWRITE, (err) =>{
if(err){ console.log(err); }
else { console.log("DB Connected"); }
});
}
我的输出是:
- number one
- number two
- DB Connected
我检查了很多文章和文档,我找不到在 "main function" 中重用函数的好方法(比如在我的示例中:函数 运行())。我很惊讶等待完成的数据库查询显然不是事情......
您的函数中需要 async/await。所以新代码看起来像:
async function Init_database_connection(){...}
...
async function userjoinedFunction(username){
await Init_database_connection();
if(await UserAlreadySignedup(username)){
return WelcomeMessage(username);
}
return AddUserToDatabase(username);
}
关于您的编辑,Init_database_connection 应该返回一个等待工作的承诺,如下所示:
async function Init_database_connection(){
return new Promise((resolve, reject)=>{
db = new sqlite3.Database("path", sqlite.OPEN_READWRITE, (err) =>{
if(err){
console.log(err);
reject();
}else {
console.log("DB Connected");
resolve()
}
});
})
}
我在开发自己的 Node.JS 应用程序时遇到了一些问题。我是这种代码架构的新手,对异步也不是很好。
目前我的 index.js 脚本中有一个事件,需要另一个脚本 database.js。此数据库脚本将处理我的应用程序中的每个数据库调用。
index.js
const db = require('database.js');
//Called when a userjoin the application, this is working well//
db.userJoinedFunction("username");
我正计划在 "userjoinedFunction" 中添加其他函数调用。例如:首先建立数据库连接 --> 第二次检查用户是否已经在数据库中 --> 3d 如果没有,则创建用户条目 --> 4 如果是,请返回欢迎消息。 由于我必须多次建立数据库连接,所以我想在这些函数中重用一些代码,如下所示:
database.js
module.exports.userJoinedFuntion = userJoinedFunction
function userjoinedFunction(username){
Init_database_connection();
if(UserAlreadySignedup(username)){
WelcomeMessage(username);
}
else {
AddUserToDatabase(username);
}
}
但显然我做错了,因为异步 Node.js 应用程序不可能那么简单...我怎样才能拥有那种类型的可重用架构?你有我可以阅读的有关该主题的文章吗?
非常感谢您的帮助!
编辑 29/05/2019
在 novomanish 的回应下,我尝试了这个:
async fonction run(){
await(call("number 1");
await Init_database_connection();
await(call("number 2");
}
async function call(text){
console.log(text);
}
async function Init_database_connection(){
db = new sqlite3.Database("path", sqlite.OPEN_READWRITE, (err) =>{
if(err){ console.log(err); }
else { console.log("DB Connected"); }
});
}
我的输出是:
- number one
- number two
- DB Connected
我检查了很多文章和文档,我找不到在 "main function" 中重用函数的好方法(比如在我的示例中:函数 运行())。我很惊讶等待完成的数据库查询显然不是事情......
您的函数中需要 async/await。所以新代码看起来像:
async function Init_database_connection(){...}
...
async function userjoinedFunction(username){
await Init_database_connection();
if(await UserAlreadySignedup(username)){
return WelcomeMessage(username);
}
return AddUserToDatabase(username);
}
关于您的编辑,Init_database_connection 应该返回一个等待工作的承诺,如下所示:
async function Init_database_connection(){
return new Promise((resolve, reject)=>{
db = new sqlite3.Database("path", sqlite.OPEN_READWRITE, (err) =>{
if(err){
console.log(err);
reject();
}else {
console.log("DB Connected");
resolve()
}
});
})
}