【问题标题】:API Delete method in express.js Errorexpress.js 错误中的 API 删除方法
【发布时间】:2018-07-18 21:21:49
【问题描述】:

如何处理删除查询当 ID 在 App.delete 方法中不可用时不给出错误。在这两种情况下都显示成功。如果 id 不可用,那么它应该输出 id not available to delete task 。 通过 id 方法获取的情况相同。如果 id 可用,它可以正常工作。如果 id 不可用,则不会显示错误

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const mysql = require('mysql');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));

// connection configurations
const mc = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: '1234'
});

// connect to database
mc.connect();

// default route
app.get('/', function (req, res) {
    return res.send({ error: true, message: 'hello' })
});

// Retrieve all todos 
app.get('/todos', function (req, res) {
    mc.query('SELECT * FROM tasks', function (error, results, fields) {
        if (error) throw error;
        return res.send({ error: false, data: results, message: 'Todos list.' });
    });
});

// Search for todos with ‘bug’ in their name
app.get('/todos/search/:keyword', function (req, res) {
    let keyword = req.params.keyword;
    mc.query("SELECT * FROM tasks WHERE task LIKE ? ", ['%' + keyword + '%'], function (error, results, fields) {
        if (error) throw error;
        return res.send({ error: false, data: results, message: 'Todos search list.' });
    });
});

// Retrieve todo with id 
app.get('/todo/:id', function (req, res) {

    let task_id = req.params.id;

    mc.query('SELECT * FROM tasks where id=?', task_id, function (error, results, fields) {
        if (error) throw error;
        return res.send({ error: false, data: results[0], message: 'Todos list.' });
    });

});

// Add a new todo  
app.post('/todo', function (req, res) {

    let task = req.body.task;

    if (!task) {
        return res.status(400).send({ error:true, message: 'Please provide task' });
    }

    mc.query("INSERT INTO tasks SET ? ", { task: task }, function (error, results, fields) {
        if (error) throw error;
        return res.send({ error: false, data: results, message: 'New task has been created successfully.' });
    });
});

//  Update todo with id
app.put('/todo', function (req, res) {

    let task_id = req.body.task_id;
    let task = req.body.task;

    if (!task_id || !task) {
        return res.status(400).send({ error: task, message: 'Please provide task and task_id' });
    }

    mc.query("UPDATE tasks SET task = ? WHERE id = ?", [task, task_id], function (error, results, fields) {
        if (error) throw error;
        return res.send({ error: false, data: results, message: 'Task has been updated successfully.' });
    });
});

//  Delete todo
app.delete('/todo/:id', function (req, res) {

    let task_id = req.params.id;

    if (!task_id) {
        return res.status(400).send({ error: true, message: 'Please provide text_id' });
    }
    mc.query('DELETE FROM tasks WHERE id = ?', task_id, function (error, results, fields) {
        if (error) throw error;
        return res.send({ error: false, data: results, message: 'text has been Deleted successfully.' });
    });
});

// all other requests redirect to 404
app.all("*", function (req, res) {
    return res.status(404).send('page not found')
});

// port must be set to 8080 because incoming http requests are routed from port 80 to port 8080
app.listen(8080, function () {
    console.log('Node app is running on port 8080');
});

// allows "grunt dev" to create a development server with livereload
//module.exports = app;

【问题讨论】:

  • 关于问题中代码的小建议。我建议您删除代码中不相关的部分,以明确您的要求。

标签: mysql node.js api express sql-delete


【解决方案1】:

您必须将参数定义为可选。

Express 使用 path-to-regexp 来匹配路由路径;见 path-to-regexp 文档,用于定义所有可能性 路线路径。 Express Route Tester 是一款方便的基础测试工具 Express 路由,虽然它不支持模式匹配。

https://expressjs.com/en/guide/routing.html

适用于 /todo 和 /todo/{id},

路线 - /todo/:id*?

 //  Delete todo
app.delete('/todo/:id*?', function (req, res) {


});

【讨论】:

  • 抱歉@Roy 我听不懂?我按照这个链接arjunphp.com/creating-restful-api-express-js-node-js-mysql
  • 每个路由在代码中注册一个端点:GET /todo/:id == /todo/1, DELETE /todo/:id' == /todo/1。当您向没有参数的端点发送 DELETE 类型的请求时,代码不知道如何处理它,因为参数是强制性的,并且是路由路径的一部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 2019-09-13
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多