【问题标题】:Can't get data from Google Datastore from Node.js无法从 Node.js 的 Google Datastore 获取数据
【发布时间】:2018-06-25 02:10:58
【问题描述】:

我无法从方法getuserpost 获取数据。网页卡住了,什么也不显示。

其余代码可以很好地添加和删除数据,然后重定向到主页,但该方法不显示 JSON 输出。我试过 res.sendres.render 但没有。

有人知道这段代码有什么问题吗?

app.get('/getuser', (req, res) => {
    res.render('getuser');
});
//DOESN'T WORK
app.post('/getuserpost', (req, res) => {
    const query = datastore.createQuery('usersTable').filter('girl', req.body.girl_field).order('timestamp', { descending: true }).limit(10);
    datastore.runQuery(query).then((results) => {
        const entities = results[0];
        res.json(entities[0]);
    });
});

这是该方法的 HTML:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <form action="/getuserpost/" method="POST">     
        <label for="girl_name">Enter girl: </label>
        <input id="girl_name" type="text" name="girl_field" value="Default girl for user">
        <input type="submit" value="OK">
    </form>
    <br>
    <a href="/home">Home</a>
    <br>
    <a href="/adduser">Add user</a>
    <br>
    <a href="/updateuser">Update user</a>
    <br>
    <a href="/deleteuser">Delete user</a>
    <br>
</body>

</html>

我将 Google Datastore 与 Google App Engine 结合使用。

【问题讨论】:

  • 请指定错误信息或执行结果,
  • 我不知道如何在应用引擎中查看错误日志
  • 转到日志记录并选择您部署的应用程序。此外,您可以在浏览器中查看网络选项卡,以查看服务器返回的内容。
  • 当我按下确定时,它什么也不做。 Explorer 中的充电轮在无所事事地跑来跑去
  • “错误:提供了不支持的字段值,未定义”我不明白,因为我可以添加和删除但不能读取

标签: node.js google-app-engine google-cloud-datastore


【解决方案1】:

我猜你错过了过滤器中的运算符选项。

.filter('girl', "=", req.body.girl_field)

【讨论】:

  • 我已经尝试过了,但不起作用。删除方法有效并且不使用那个“=”符号。我已删除 App Engine 中的所有旧错误消息我已多次使用 get user web 但没有出现新错误。我在使用“gcloud app deploy”之前使用过“gcloud app deploy index.yaml”,也没有使用过。我在资源管理器中看到了“网络”选项卡,但没有显示任何内容。
  • 当我使用 Postman 时,我收到: 502 Bad Gateway

    502 网关错误


    nginx
  • 运算符在=的情况下是可选的
【解决方案2】:

使用“NODE JS”从“APP ENGINE”中的“DATASTORE”读取数据的解决方案:

app.get('/getuser', (req, res) => {
res.render('getuser');
});
//WORKS
app.post('/getuserpost', (req, res) => {
    const query = datastore.createQuery('usersData').filter('girl', 
req.body.girl_field);
    datastore.runQuery(query).then((results) => {
        const entities = results[0];
        datastore.get(entities[0][datastore.KEY], (err, entity) => {
            if (!err) {
                res.send(entity);
            }
        });
    });
});

【讨论】:

  • 你做错了什么。实体应该已经包含数据。我们在项目中的每一个地方都使用了这种方法。您是否记录了实体内部的内容?
  • 你是对的,代码在没有 datastore.get() 方法的情况下也能正常工作。问题一直是“const query”变量。我摆脱了查询中“过滤”之后的方法,代码运行完美。谢谢
【解决方案3】:
app.get('/getuser', (req, res) => {
res.render('getuser');
});
//WORKS
app.post('/getuserpost', (req, res) => {
    /*const query = datastore.createQuery('usersData').filter('girl', 
req.body.girl_field).order('timestamp', { descending: true }).limit(10);
    datastore.runQuery(query).then((results) => {
       const entities = results[0];
        datastore.get(entities[0][datastore.KEY], (err, entity)=>{
            if(!err){
                res.json(entity);
            }else{
                console.log(err);
            }
        });
    });*/
    res.send("output");

});

问题在于 getuserpost 中的代码,当我注释代码时它可以工作,但是当我删除 res.send("output") 并取消注释代码时它卡住了。 这个评论版本也不起作用。 下面的这个删除方法有效并且它的查询有效

app.get('/deleteuser', (req, res) => {
    res.render('deleteuser');
});
//WORKS
app.post('/deleteuserpost', (req, res) => {
    const query = datastore.createQuery('usersData').filter('car', req.body.car_field);
    datastore.runQuery(query).then((results) => {
        const entities = results[0];
        datastore.delete(entities[0][datastore.KEY], (err) => {
            if (!err) {
                res.redirect('/');
            }
        });
    });
});

【讨论】:

    【解决方案4】:

    使用“NODE JS”在“APP ENGINE”中从“DATASTORE”添加数据的解决方案:

    //WORKS
    app.post('/adduserpost', (req, res) => {
    
        const user = {
            timestamp: new Date,
            name: req.body.name_field,
            girl: req.body.girl_field,
            car: req.body.car_field
        }
    
        datastore.save({
            key: datastore.key('usersData'),
            data: user
        }).then(() => {
            res.redirect('/');
        }).catch((err) => {
            res.redirect('/');
        });
    
    });
    

    【讨论】:

    • 这太不可思议了。我正在编写对我有用的 CRUD 方法,以帮助将来看到这一点的其他人,我受到了惩罚。我退出了
    【解决方案5】:

    使用“NODE JS”从“APP ENGINE”中的“DATASTORE”更新数据的解决方案:

    //WORKS
    app.post('/updateuserpost', (req, res) => {
        const query = datastore.createQuery('usersData').filter('car', req.body.car_field);
        datastore.runQuery(query).then((results) => {
            let entities = results[0];
            entities[0].car = req.body.new_car_field;
            const entity = {
                key: entities[0][datastore.KEY],
                data: entities[0],
              };
    
              datastore.update(entity).then(() => {
                res.redirect('/');
              });
        });
    });
    

    【讨论】:

      【解决方案6】:

      您需要为字段 girltimestamp 建立复合索引。 关于复合索引的文档here

      您的 yaml 文件应包含以下内容

      - kind: usersTable
        properties:
        - name: girl
        - name: timestamp
          direction: desc
      

      要应用复合索引,请运行以下命令

      gcloud -q datastore create-indexes path/to/yaml/file
      

      【讨论】:

        猜你喜欢
        • 2013-11-29
        • 1970-01-01
        • 2021-10-21
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        • 2020-02-27
        • 2018-09-27
        • 1970-01-01
        相关资源
        最近更新 更多