Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我需要在节点postgres中使用async/await两次_Javascript_Node.js_Async Await_Es6 Promise_Node Postgres - Fatal编程技术网

Javascript 为什么我需要在节点postgres中使用async/await两次

Javascript 为什么我需要在节点postgres中使用async/await两次,javascript,node.js,async-await,es6-promise,node-postgres,Javascript,Node.js,Async Await,Es6 Promise,Node Postgres,我写的这段代码似乎很有效: database.js const {Pool} = require('pg'); const pool = new Pool({ connectionString: process.env.DATABASE_URL, }); module.exports = { query: (text, params) => pool.query(text, params) }; auth_facade.js const database = require('../

我写的这段代码似乎很有效:

database.js

const {Pool} = require('pg');

const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});

module.exports = {
query: (text, params) => pool.query(text, params)
};
auth_facade.js

const database = require('../../utils/database');

module.exports.findPersonByEmail = async function(email) {
const query = 'SELECT * FROM Person WHERE email = $1';
const values = [email];

try {
    console.log(1);
    const {rows} = await database.query(query, values);
    console.log(2);
    return rows[0];
} catch (err) {
    next(err);
}
};
auth_controller.js

const authFacade = require('./auth_facade');

module.exports.signin = async function(req, res, next) {
console.log(0);
var person = await authFacade.findPersonByEmail(req.body.email);
console.log(3);
};
正如我所料,它显示了0123

但是,我不明白为什么我需要在
auth_facade::findPersonByEmail
auth_controller::signin
上使用
async/await

为什么,如果我从
auth_controller::signin
签名中删除async,并在签名中删除
wait
,我将不再得到0123,而是得到0132?难道它不应该被阻止吗?auth_facade?

您当前的代码:

一家人去购物中心。(0)爸爸累了,说:“去买点东西吧,我等着,然后我们一起回家。”(1)过了一会儿,女儿说:“我不想进那家商店,我就在这里等你,然后我们再回到爸爸身边。”(2)妈妈买完东西,回到女儿身边,(3)他们都回来接爸爸,然后一起回家

您的代码没有外部
等待

一家人去购物中心。(0)爸爸很累,说“去买点东西吧,我会在这里的。”(1)过了一会儿,女儿说“我不想去那家商店,我就在这里等你,然后我们再回到爸爸身边。”然而,大约在同一时间,(3)爸爸转过身,决定回家,因为等待是为了失败者。(2) 妈妈买完东西回到女儿身边,他们都回来发现爸爸开车走了,他们被困在商场里,手里拿着一堆购物袋

女儿和父亲都需要等待,以便他们不会留下任何人。

您当前的代码:

一家人去购物中心。(0)爸爸累了,说:“去买点东西吧,我等着,然后我们一起回家。”(1)过了一会儿,女儿说:“我不想进那家商店,我就在这里等你,然后我们再回到爸爸身边。”(2)妈妈买完东西,回到女儿身边,(3)他们都回来接爸爸,然后一起回家

您的代码没有外部
等待

一家人去购物中心。(0)爸爸很累,说“去买点东西吧,我会在这里的。”(1)过了一会儿,女儿说“我不想去那家商店,我就在这里等你,然后我们再回到爸爸身边。”然而,大约在同一时间,(3)爸爸转过身,决定回家,因为等待是为了失败者。(2) 妈妈买完东西回到女儿身边,他们都回来发现爸爸开车走了,他们被困在商场里,手里拿着一堆购物袋


女儿和父亲都需要等待,以便他们不留下任何人。

你需要在两个地方等待的原因是,
AuthFacade
AuthController
,因为你在处理两个不同的承诺:

  • 中的一个findPersonByEmail()
    (来自数据库查询)
  • 一个来自
    findPersonByEmail()
  • 显示:

    findPersonByEmail(email: string): Promise<Person>;
    
    //same difference
    let person = await authFacade.findPersonByEmail(req.body.email);
    
    //same difference
    authFacade.findPersonByEmail(req.body.email).then(person => {
    });
    
    findPersonByEmail(email:string):承诺;
    //相同差异
    let person=等待authFacade.findPersonByEmail(req.body.email);
    //相同差异
    authFacade.findPersonByEmail(req.body.email)。然后(person=>{
    });
    

    如果您想了解更多信息,请阅读:。

    您需要在两个地方等待的原因是,
    AuthFacade
    AuthController
    ,因为您正在处理两个不同的承诺:

  • 中的一个findPersonByEmail()
    (来自数据库查询)
  • 一个来自
    findPersonByEmail()
  • 显示:

    findPersonByEmail(email: string): Promise<Person>;
    
    //same difference
    let person = await authFacade.findPersonByEmail(req.body.email);
    
    //same difference
    authFacade.findPersonByEmail(req.body.email).then(person => {
    });
    
    findPersonByEmail(email:string):承诺;
    //相同差异
    let person=等待authFacade.findPersonByEmail(req.body.email);
    //相同差异
    authFacade.findPersonByEmail(req.body.email)。然后(person=>{
    });
    

    如果您想了解更多信息,请阅读:.

    如果只需调用
    authFacade.findPersonByEmail
    ,则在
    登录
    函数中不需要
    async/wait
    ;否则,您“需要”它,因为底层的
    pool.query
    返回一个承诺(因此它是
    async
    authFacade.findPersonByEmail
    async
    ,因此它不会阻塞。如果它只调用
    authFacade.findPersonByEmail
    ,则在
    signin
    函数中不需要
    async/Wait
    ;否则,您“需要”它,因为底层的
    pool.query
    返回一个承诺(因此它是
    async
    authFacade.findPersonByEmail
    async
    ,所以它没有阻塞。很好的解释。我的下一个问题是“有没有办法避免只有一个wait/async?”我认为唯一的异步任务应该是数据库查询。换句话说,我能强迫爸爸跟着他的女儿,和她一起在商店门口等妈妈吗?事实上你能。带爸爸一起去就相当于@woozyking所说的:
    signin
    不需要是异步的。很好的解释。我的下一个问题是“有没有办法避免只有一个wait/async?”我认为唯一的异步任务应该是数据库查询。换句话说,我能强迫爸爸跟着他的女儿,和她一起在商店门口等妈妈吗?事实上你能。带上爸爸就相当于@woozyking所说的:
    signin
    不需要是异步的。