Как удалить результаты из запроса «где» в мобильных службах Azure? - PullRequest
0 голосов
/ 02 июля 2018

У меня Azure работает Node-сервер с пакетом Azure-mobile-apps, "azure-mobile-apps": "^3.0.1". Я могу использовать req.azureMobile для получения результатов из любой таблицы в файле EasyAPI:

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

Но что, если я захочу удалить результаты предложения 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();
    })
};

Я попробовал вышеупомянутое, по глупости, но это не сработало. Я нахожу документацию для Azure-Mobile-приложений трудной для поиска и трудной для понимания. Я нашел эту страницу прямо здесь , но это не говорит мне ничего, что я могу использовать.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Я следовал вашему коду и протестировал следующий код на моей стороне:

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

Прежде чем я протестировал приведенный выше код, я включил ведение журнала диагностики для своего веб-приложения и перейдите в раздел "МОНИТОРИНГ> Поток журналов" моего веб-приложения на портале Azure, чтобы просмотреть ведение журнала в реальном времени.

После отправки запроса на удаление я мог видеть журнал, похожий на этот:

2018-07-03T08: 59: 48.551Z - [35msilly [39m: выполнение оператора SQL SELECT * FROM [dbo]. [TodoItem] WHERE ([id] = @ p1); УДАЛИТЬ ИЗ [[ dbo]. [TodoItem] WHERE ([id] = @ p1); SELECT @@ rowcount AS recordsActed ; с параметрами [{"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 (оператор) для выполнения пользовательского оператора 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);
});
0 голосов
/ 02 июля 2018

ОК, я думаю, что нашел ответ, не совсем уверен. Я попробовал это, и казалось, что я удаляю записи, которые я пытался:

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 записей, что кажется мне неожиданным поведением. Может я что-то не так делаю ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...