У меня есть код Mongoose в отдельном файле model.js, а код Express для обработки запросов http находится в app.js. Я просто практикуюсь в создании API и тестировании их на Postman для воображаемого вики-сайта. API, который я пытаюсь заставить работать, - это удаление одной статьи. (Примечание: ради краткости я включил только рассматриваемый код, т.е. app.delete('/articles/:id' .... из app.js, и статический метод, который он вызывает из model.js - deleteOneArticleFromDB(articleID)

{{Х0}} :

const express = require('express');
const bodyParser = require('body-parser');
const model = require('./model');

const app = express();

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

app.delete('/articles/:id', async (req, res) => {
    const articleID = req.params.id;
    console.log(`req.params.id: ${req.params.id}`);
    try {
        const response = await model.DBUtility.deleteOneArticleFromDB(articleID);
        res.status(200).json({message: response, app: 'wiki-api'});
    } catch (err) {
        res.json({message: err, app: 'wiki-api'});
    }
});

const port = 3000;
app.listen(port, () => {
    console.log(`Server started on port ${port}`);
});

model.js :

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/wikiDB', {useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false });

const articleSchema = new mongoose.Schema({
    title: String,
    content: String
});

const Article = mongoose.model('Article', articleSchema);

class DBUtility {

    static deleteOneArticleFromDB(articleID) {
        return new Promise((resolve, reject) => {
            Article.findByIdAndDelete(articleID, (err) => {
                if (err) {
                    reject(err);
                } else {
                    resolve(`Deleted article ${articleID} successfully`);
                }
            });
        });
    }
}

exports.DBUtility = DBUtility;

У меня есть 5 статей (5 документов) в моей базе данных:

{
    "_id" : "5c139771d79ac8eac11e754a",
    "title" : "API",
    "content" : "API stands for Application Programming Interface. It is a set of subroutine definitions, communication protocols, and tools for building software. In general terms, it is a set of clearly defined methods of communication among various components. A good API makes it easier to develop a computer program by providing all the building blocks, which are then put together by the programmer."
}

/* 2 */
{
    "_id" : "5c1398aad79ac8eac11e7561",
    "title" : "Bootstrap",
    "content" : "This is a framework developed by Twitter that contains pre-made front-end templates for web design"
}

/* 3 */
{
    "_id" : "5c1398ecd79ac8eac11e7567",
    "title" : "DOM",
    "content" : "The Document Object Model is like an API for interacting with our HTML"
}

/* 4 */
{
    "_id" : "5ea2c188fa57aa1b6453eda5",
    "title" : "Node JS",
    "content" : "Node.js is an open-source, cross-platform, JavaScript runtime environment that executes JavaScript code outside of a web browser. Node.js lets developers use JavaScript to write command line tools and for server-side scripting—running scripts server-side to produce dynamic web page content before the page is sent to the user's web browser. Consequently, Node.js represents a \"JavaScript everywhere\" paradigm,[6] unifying web-application development around a single programming language, rather than different languages for server- and client-side scripts.",
    "__v" : 0
}

/* 5 */
{
    "_id" : "5ea2d5304e19b11e0013a86a",
    "title" : "EJS",
    "content" : "EJS is a simple templating language that lets you generate HTML markup with plain JavaScript. No religiousness about how to organize things. No reinvention of iteration and control-flow. It's just plain JavaScript",
    "__v" : 0
}

Я пытаюсь удалить последнюю статью (документ) с заголовком EJS. Итак, в Почтальоне я запускаю http-запрос следующим образом:

enter image description here

Как видите, я получаю успешный ответ. Однако, когда я проверяю свою базу данных, документ все еще там (я нажал несколько раз обновить и также проверил его с запросом GET, чтобы вернуть все статьи, которые показали, что статья все еще там): введите описание изображения здесь

Вот вывод терминала:

[nodemon] starting `node app.js`
Server started on port 3000
req.params.id: 5ea2d5304e19b11e0013a86a

Я был на этом в течение двух дней. Я проверил все предыдущие посты SO с похожими заголовками, но не смог найти ни одного, относящегося к моей проблеме. Я не понимаю, где я иду не так !! Любая помощь могла бы быть полезна.

0
Hazzaldo 25 Апр 2020 в 01:46

2 ответа

В MongoDB свойство _id имеет тип ObjectId.
У меня была та же проблема, и я решил ее, пропустив ObjectId.

Вы пробовали следующее?

const Mongoose = require('mongoose');
const articleId = Mongoose.Types.ObjectId(req.params.id);
1
Reqven 24 Апр 2020 в 23:00

1- возможно, ваша mongoose версия не поддерживает findByIdAndDelete

Попробуйте findByIdAndRemove вместо

2 - вы можете передать идентификатор этому методу в виде строки или в качестве objectId

Убедитесь, что вы передаете правильный идентификатор без пробелов

const articleID = req.params.id.toString().trim(); // trim will remove any spaces before or after the id

Надеюсь, это поможет

0
Mohammed Yousry 25 Апр 2020 в 00:05