javascript - 在 node+express 中使用 sequelize 从数据库中进行顺序查询

标签 javascript node.js express npm sequelize.js

我刚刚开始 Node 并且来自 PHP 背景。一段时间以来,我一直试图找出 promise ,但无法弄清楚。

我试图在循环中的第二个查询中使用一个查询的结果,但有两个问题:

-ONE:typeof 值显示一个对象;但是当我安慰它时,它显示未定义

-二:我的结果没有按正确顺序排列。我正在尝试使用“then()”,但无法弄清楚。 “inside promise 2”在'then()' 1 块中的循环之前被安慰出来

这是我在代码中所做的:

exports.followers_temp = function(req, res)
{
    db.sequelize.query('SELECT DISTINCT public."Users".id as user_id, public."Users".full_name, public."Users".profile_image_url, (SELECT COUNT(*) FROM public."Followships" WHERE public."Followships".leader_id = public."Users".id AND public."Followships".follower_id = :leader_id) AS is_followed FROM public."Users"  INNER JOIN public."Followships" ON public."Users".id = public."Followships".follower_id WHERE  public."Followships".leader_id = :leader_id LIMIT :limit OFFSET :offset',  { replacements: { leader_id: req.params.leader_id, limit: req.params.limit, offset: req.params.offset }, type: db.sequelize.QueryTypes.SELECT}).
    then(function(data){
      console.log('i am here; length: ' + data.length);
        return new Promise(function(resolve, reject) {
              console.log('inside promise 1, should have access to data object');

              console.log('before loop');
              for(let i=0; i < data.length; i++){
                  var temp = db.sequelize.query('(SELECT COUNT(*) AS is_following FROM public."Followships" WHERE public."Followships".leader_id = ' + data[i].user_id + ' AND public."Followships".follower_id = :my_id)',  { replacements: { leader_id: req.params.leader_id, my_id: req.params.my_id, limit: req.params.limit, offset: req.params.offset }, type: db.sequelize.QueryTypes.SELECT})
                  temp.then(function(value){

                    // Issue ONE
                      console.log('type: '+ typeof value); // it's an object
                      console.log('is_following: '+ value.is_following); // yet it's giving undefined

                      console.log('value: '+ JSON.stringify(value)); // but it prints out when I stringify it

                      data[i].is_followed = value.is_following;
                  });
              }
            resolve(data);
            });
    })

    .then(function(my_array){
        // Issue TWO
        console.log('inside promise 2');

        return res.status(200).send({
            error:false,
            message: my_array
        });
    })
        .catch(function(err) {
            console.log('inside promise catch');
            return res.status(400).send({
                error:true,
                message: errorHandler.getErrorMessage(err)
            });
        });
};

这是控制台输出:
i am here; length: 5          
inside promise 1, should have 
before loop                   
inside promise 2              
type: object                  
is_following: undefined       
value: [{"is_following":"1"}] 
type: object                  
is_following: undefined       
value: [{"is_following":"0"}] 
type: object                  
is_following: undefined       
value: [{"is_following":"1"}] 
type: object                  
is_following: undefined       
value: [{"is_following":"1"}] 
type: object                  
is_following: undefined       
value: [{"is_following":"0"}] 

请告诉我
-我究竟做错了什么?
-如果你能明智地使用 promises 语法......会很棒

感谢你在期待;请忽略菜鸟错误,因为我现在是菜鸟。

最佳答案

db.sequelize.query 是放在 for 循环中的异步调用。这将开始查询,但尚未成功完成。所以,你的 data 还没有完成,你已经在解决它了。使用 Promise.all 你可以这样写:

Promise.all(data.map((val) => { // here val = data[i] inside the query
    return new Promise((resolve, reject) => {
        db.sequelize.query(...)
            .then((value) => {
                // modify your data object here.
                resolve();
            });
    });
})).then(() => { resolve(data);});

关于javascript - 在 node+express 中使用 sequelize 从数据库中进行顺序查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48685452/

相关文章:

javascript - 使用 Apps 脚本将图片上传到 Google 云端硬盘

javascript - Dojo访问js文件之外的js对象

javascript - 使用 Flash 通过 JavaScript 打开文件保存对话框

node.js - 不支持 MongoDB Azure OPERATOR_PULL

javascript - Multer 给了我未定义的文件

express - 使用 webpack-dev-middleware 时如何在移相器应用程序中加载图像?

javascript - Rselenium 无法点击所有单选按钮(仅限其中一些)

javascript - 将 css 文件链接到 node.js 服务器

javascript - Gulp - 如何附加到目标而不是替换

node.js - Mongoose 在引用的文档属性中查找