如何从Azure移动服务中的“哪里”查询中删除结果?

时间:2018-07-02 14:43:16

标签: node.js azure azure-mobile-services

我已经使用Azure-mobile-apps软件包req.azureMobile在Azure上运行节点服务器。我可以使用module.exports = { get: asyncMiddleware(async (req, res, next) => { const deviceTable = req.azureMobile.tables('Devices'); var results = await deviceTable.where(function(date) { return this.last_active < date }, new Date(2018,5,5)).read(); res.status(201).send(results); }) }; 从EasyAPI文件中的任何给定表中获取结果:

where

但是如果我想删除 module.exports = { delete: asyncMiddleware(async (req, res, next) => { const deviceTable = req.azureMobile.tables('Devices'); await deviceTable.where(function(date) { return this.last_active < date }, new Date(2018,5,5)).delete(); res.status(201).send(); }) }; 子句的结果怎么办?

list

我已经愚蠢地尝试了上面的方法,但是没有用。我发现azure-mobile-apps的文档很难找到也很难理解。我找到了此页面right here,但这没有告诉我我可以使用的任何内容。

2 个答案:

答案 0 :(得分:0)

好的,我想我已经找到答案了,并不完全确定。我尝试了此操作,它似乎完全删除了我要尝试的记录:

module.exports = {
    delete: asyncMiddleware(async (req, res, next) => {
        const deviceTable = req.azureMobile.tables('Devices');

        await deviceTable.delete(deviceTable.where(function(date) {
            return this.last_active < date
        }, new Date(2018,5,5)));

        res.status(201).send();
    })
};

恼人的是,当要删除0条记录时,这似乎是错误,这对我来说似乎是意外行为。也许我做错了事...

答案 1 :(得分:0)

我遵循了您的代码,并在我这边测试了以下代码:

req.azureMobile.tables('TodoItem')
   .delete(req.azureMobile.tables('TodoItem')
   .where(function(id){return this.id ==id;},req.query.id))
   .then(results=>{
       //res.json(results);
        res.status(201).send(results);
   })
   .catch(next);

在测试上面的代码之前,我为Web应用启用了diagnostics logging,然后在Azure Portal上转到Web应用的“监视>日志流”以查看实时日志。

发送删除请求后,我可以看到如下日志:

  

2018-07-03T08:59:48.551Z-[35msilly。[39m:执行SQL语句 SELECT * FROM [dbo]。[TodoItem] WHERE([id] = @ p1); DELETE FROM [ dbo]。[TodoItem]位置([id] = @ p1);选择@@ rowcount受影响的AS记录;参数为[{“ name”:“ p1”,“ pos”:1,“ value”:“ 123”}]

以一种简单的方式,我只是转到我的应用程序服务的“移动>简易表格”,发现我之前删除的记录已被完全删除。另外,我尝试通过添加以下附加查询参数__includeDeleted通过浏览器检索以前的记录:

https://{your-mobile-app}.azurewebsites.net/tables/todoitem/{record-id}?ZUMO-API-VERSION=2.0.0&__includeDeleted=true

注意::如果该记录不存在,那么我将收到404状态代码和以下文本消息:

{
    "error": "The item does not exist"
}

根据我的测试,上述过程也可以按以下方式实现:

 req.azureMobile.tables('TodoItem')
    .delete({id:req.query.id})
    .then(results=>{
       //res.json(results);
        res.status(201).send(results);
   });

根据我的测试,上述删除操作将完全删除记录,而不是将deleted字段设置为true,并且如果记录不存在,那么您将收到404错误。

此外,我检查了是否可以使用execute(statement)来执行自定义SQL语句,即使该记录不存在也是如此。这是代码段,您可以参考它:

var query = {
    sql: 'UPDATE TodoItem SET DELETED=1 where id=@id',
    parameters: [
        {name:'id',value:req.query.id}
    ]
};

req.azureMobile.data.execute(query).then(function (results) {
    res.json(results);
});