无法从Node.js从Google Datastore获取数据

时间:2018-01-16 11:20:08

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

我无法从方法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数据存储区与Google App Engine结合使用。

6 个答案:

答案 0 :(得分:0)

我猜你错过了过滤器中的操作员选项。

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

答案 1 :(得分:0)

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(&#34;输出&#34;)并取消注释代码它卡住了。 这个评论版本既不起作用也不起作用。 下面的删除方法有效,其查询有效

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('/');
            }
        });
    });
});

答案 2 :(得分:0)

从&#34; DATASTORE&#34;读取数据的解决方案IN&#34; APP ENGINE&#34;使用&#34; NODE JS&#34;:

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);
            }
        });
    });
});

答案 3 :(得分:0)

使用“NODE JS”从“APP引擎”中添加“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('/');
    });

});

答案 4 :(得分:0)

来自&#34; DATASTORE&#34;更新数据的解决方案IN&#34; APP ENGINE&#34;使用&#34; NODE JS&#34;:

//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('/');
          });
    });
});

答案 5 :(得分:0)

  

您需要对字段girltimestamp进行综合索引编制。   关于综合索引的文档here

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

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

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

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