关于 Node.js 中函数语法的问题
Question about the syntax of a function in Node.js
我正在按照教程做博客,针对server.js文件中的MongoDB连接,导师做了一个锅炉连接函数withDB. operations 和 res 是 withDB 函数的属性。在第 6 行中,operations 是一个函数传递给 withDB 函数的一个 prop 吗?
下面是withDB函数。
const withDB = async (operations, res) => {
try {
const client = await MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true });
const db = client.db('my-blog');
await operations(db); // is operations a function that takes db as its props?
client.close();
} catch (error) {
res.status(500).json({ message: 'Error connecting to db', error });
}
}
在函数中使用 withDB
app.get('/api/articles/:name', async (req, res) => {
withDB(async (db) => {
const articleName = req.params.name;
const articleInfo = await db.collection('articles').findOne({ name: articleName })
res.status(200).json(articleInfo);
}, res);
})
是的,实际上 operations
是您的回调函数,您在初始化数据库连接后使用 db 作为参数调用它。
也许您对 ES6 箭头函数语法不满意。您可以在 Mdn doc 中找到一个带有旧正则函数的简单示例,在您的情况下它可能是:
function findArticlesByName(articleName) {
return function(db) {
return db.collection('articles').findOne({ name:
articleName });
}
}
async function withDB(callback) {
try {
const client = await MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true });
const db = client.db('my-blog');
return callback(db);
} catch (error) {
throw new Error({ message: 'Error connecting to db', error });
} finally {
client?.close();
}
}
app.get('/api/articles/:name', async (req, res) => {
try {
const articleInfo = await withDB(findArticlesByName(req.params.name));
res.status(200).json(articleInfo);
} catch(error) {
res.status(500).json(error);
}
})
结论,您可以像示例中那样轻松地内联回调函数,但这样可能更容易理解。
此外,您应该避免使用包装器在每次请求后创建和关闭数据库连接,因为它可能会出现一些奇怪的错误。应尽可能共享数据库连接或任何 resource-intensive 任务。
因此,更好的解决方案是使用单例的默认实现创建特定的 class,在应用程序顶部构建连接的单个实例,将单个实例传递到需要的每个模块然后它会在退出您的应用程序之前关闭您的连接。
希望对您有所帮助。
我正在按照教程做博客,针对server.js文件中的MongoDB连接,导师做了一个锅炉连接函数withDB. operations 和 res 是 withDB 函数的属性。在第 6 行中,operations 是一个函数传递给 withDB 函数的一个 prop 吗?
下面是withDB函数。
const withDB = async (operations, res) => {
try {
const client = await MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true });
const db = client.db('my-blog');
await operations(db); // is operations a function that takes db as its props?
client.close();
} catch (error) {
res.status(500).json({ message: 'Error connecting to db', error });
}
}
在函数中使用 withDB
app.get('/api/articles/:name', async (req, res) => {
withDB(async (db) => {
const articleName = req.params.name;
const articleInfo = await db.collection('articles').findOne({ name: articleName })
res.status(200).json(articleInfo);
}, res);
})
是的,实际上 operations
是您的回调函数,您在初始化数据库连接后使用 db 作为参数调用它。
也许您对 ES6 箭头函数语法不满意。您可以在 Mdn doc 中找到一个带有旧正则函数的简单示例,在您的情况下它可能是:
function findArticlesByName(articleName) {
return function(db) {
return db.collection('articles').findOne({ name:
articleName });
}
}
async function withDB(callback) {
try {
const client = await MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true });
const db = client.db('my-blog');
return callback(db);
} catch (error) {
throw new Error({ message: 'Error connecting to db', error });
} finally {
client?.close();
}
}
app.get('/api/articles/:name', async (req, res) => {
try {
const articleInfo = await withDB(findArticlesByName(req.params.name));
res.status(200).json(articleInfo);
} catch(error) {
res.status(500).json(error);
}
})
结论,您可以像示例中那样轻松地内联回调函数,但这样可能更容易理解。
此外,您应该避免使用包装器在每次请求后创建和关闭数据库连接,因为它可能会出现一些奇怪的错误。应尽可能共享数据库连接或任何 resource-intensive 任务。
因此,更好的解决方案是使用单例的默认实现创建特定的 class,在应用程序顶部构建连接的单个实例,将单个实例传递到需要的每个模块然后它会在退出您的应用程序之前关闭您的连接。
希望对您有所帮助。