В настоящее время я использую MongoDB локальную версию 3.2.3. Текущий сервер узла версии 7.2.0. API был написан в машинописном документе.Как обновить базу данных MongoDB, используя Express JS и Mongoose с методом PUT?
Перечень соответствующих зависимостей:
"dependencies": {
"@types/mongoose": "^4.7.3",
"@types/node": "^6.0.56",
"bcrypt-nodejs": "0.0.3",
"body-parser": "^1.15.2",
"compression": "^1.6.2",
"dotenv": "^4.0.0",
"ejs": "^2.5.5",
"express": "^4.14.0",
"mongodb": "^2.2.21",
"mongoose": "^4.7.6",
"path": "^0.12.7"
}
Мои server.js файл соответствующие заявления:
// Modules extending node
import * as express from 'express';
import * as bodyParser from 'body-parser';
import * as http from 'http';
import * as path from 'path';
// Custom modules imported. Some are routers behaving as miniapps routed to the main app.
import { digitalAssetRouter } from './api/digitalMedia/digitalmediaController';
/**
* Node Express Server Controller
*/
let app = express();
app.use((req, res, next)=>{
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3050');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
res.setHeader('Access-Control-Allow-Credentials', true);
next();
});
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views/'));
let server = http.createServer(app);
//Configure express
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use((err, req, res, next) =>
res.status(500).send(JSON.stringify({ err: 'Bad API Request!' }))
);
//Route
app.use('/', indexRouter);
//API Routes
// API Information
app.use('/api/v1', digitalAssetRouter);
// Digital Assets
//GET ALL AND POST CREATE ONE
app.use('/api/v1/digitalassets', digitalAssetRouter);
//GET ONE BY ID, PUT ONE BY ID, DELETE ONE BY ID
app.use('/api/v1/digitalassets/:digitalassetsId', digitalAssetRouter);
//UPDATE BY ID I TRIED BOTH WAYS, ABOVE AND BELOW
app.use('/api/v1/digitalassets/update/:digitalassetsId', digitalAssetRouter);
// catch 404 and forward to error handler
app.use((req, res, next) => {
let err = new Error('Not Found');
err.message = '404';
next(err);
});
// error handler
app.use((err, req, res, next) => {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
//server start
server.listen(3000,() => {
console.log('LOCALHOST Running @ port 3000');
console.log(app.get('env'));
});
//Expose server module
export { app };
ниже моего контроллера соответствующие методы:
/**
* Digital Media Controller Module
*/
import * as express from 'express';
import { digitalAsset } from './digitalmediaModel';
//Creates a mini app that only handles routes for digital assets
let digitalAssetRouter = express.Router();
/**
* UPDATE ONE BY ID
* Patch attributes for a model instance and persist it into the data source.
*/
digitalAssetRouter.put('/digitalassets/:digitalassetsId', (req, res, next) => {
console.log(req.params);
console.log(req.body);
digitalAsset.findByIdAndUpdate(req.params.digitalassetsId, req.body)
.then(response => {
res.status(200).json({
comment: 'Patch attributes for a model instance and persist it into the data source.',
responseType: 'success'
});
})
.catch(err => {
// console.log(err);
res.status(400).json({
error: "Cannot find digital image with id: " + req.params.digitalassetsId,
errorMessage: err
});
});
});
Я читаю документацию непосредственно от mongoose относительно findByIdAndUpdate. Я сделал несколько попыток изменить способ отправки данных для обновления через почтальон.
Postman PUT method to api endpoint to update by id Я также поместил Content-Type в приложение/json в заголовках. Передача полезной нагрузки - это необработанные данные в формате JSON, показанном ниже. Это то, что появляется в console.log (req.body):
{
"altText" : "Canon alt text"
}
Ниже моя модель digitalasset:
/**
* Digital Media Model
*/
import { mongooseDb } from '../../config/db';
mongooseDb.Promise = global.Promise;
let Schema = mongooseDb.Schema;
let TagsSchema = new Schema({
id: String,
name: String,
app_id: String,
value: Number
},
{ _id: false });
let ExifSchema = new Schema({
make: String,
model: String,
width: Number,
length: Number,
created: String,
fileSource: String,
exposureMode: String,
exposureTime: String,
aperture: Number,
iso: Number,
exposureBias: Number,
flash: String,
orientation: String
},
{ _id: false });
let DigitalAssetSchema = new Schema({
fileName: String,
title: String,
caption: String,
altText: String,
description: String,
fileType: String,
uploadedOn: {
type: Date,
default: Date.now,
},
uploadedBy: String,
fileSize: {
type: Number,
},
url: {
type: String
},
relativePath: String,
categories: [String],
tags: [TagsSchema],
exif: ExifSchema,
embedUrl: String,
shareUrl: String
});
let digitalAsset = mongooseDb.model('digitalAsset', DigitalAssetSchema);
export { digitalAsset };
У меня нет проблемы при создании документов в базе данных и удалить их. Когда дело доходит до обновления их с помощью метода PUT с использованием экспресс-маршрутизации, процесс не работает. Я попробовал разные варианты, чтобы изменить одно поле в выбранном документе без успеха. Ниже приводятся примеры скриншотов в Postman:
У меня есть записи в MongoDB для обновления следующим образом.
{
"_id" : "589739a960aa6d23823cafb9",
"altText" : "CHANGE",
"description" : "CHANGE",
"relativePath" : "assets/Pics/high resolution/purchasable pictures/various.corbis/Internet/42-17083495.jpg",
"fileName" : "/disk/assets/Pics/high resolution/purchasable pictures/various.corbis/Internet/42-17083495",
"fileSize" : 8220,
"title" : "CHANGE",
"fileType" : ".jpg",
"caption" : "CHANGE",
"uploadedBy" : "rmore071",
"__v" : 0,
"tags" : [
{
"name" : "people",
"value" : 0.98049
},
{
"name" : "outdoors",
"value" : 0.9785451
},
{
"name" : "architecture",
"value" : 0.95540833
},
{
"name" : "horizontal plane",
"value" : 0.955212
},
{
"name" : "travel",
"value" : 0.95194626
},
{
"name" : "industry",
"value" : 0.9321301
},
{
"name" : "flame",
"value" : 0.9265379
},
{
"name" : "man",
"value" : 0.9220996
},
{
"name" : "business",
"value" : 0.91815794
},
{
"name" : "heat",
"value" : 0.89368707
},
{
"name" : "no person",
"value" : 0.89319044
},
{
"name" : "panoramic",
"value" : 0.8734973
},
{
"name" : "illuminated",
"value" : 0.8665502
},
{
"name" : "adult",
"value" : 0.86405236
},
{
"name" : "fossil fuel",
"value" : 0.8607676
},
{
"name" : "transportation system",
"value" : 0.8506778
},
{
"name" : "competition",
"value" : 0.83268094
},
{
"name" : "building",
"value" : 0.8307033
},
{
"name" : "action",
"value" : 0.8292489
},
{
"name" : "horizontal",
"value" : 0.829162
}
],
"categories" : [],
"uploadedOn" : "2017-02-05T14:41:45.984Z"
}
Когда я ударил отправить в Почтальон я получаю:
{
"comment": "Patch attributes for a model instance and persist it into the data source.",
"responseType": "success"
}
Это говорит мне, что обещание не возвращает ошибку и распечатать содержимое в функции, то(), так как идентификатор был принят ,
Однако, быстро просмотрев базу данных с помощью RoboMongo, я вижу, что поле altText не обновлено.
Мой вопрос в точности соответствует названию, как обновить с помощью метода PUT? Я делаю что-то неправильно, и мне бы хотелось, чтобы еще одна пара глаз заглянула и посмотрела, что я сделала неправильно. Благодарим вас за продвижение за ваше время.
Я играл с похожим кодом в течение нескольких часов, чтобы попытаться воспроизвести, но я не могу. Каков вывод 'console.log (response)' внутри 'then'' findByIdAndUpdate'? –
@ LuisDiegoHernández Чтобы ответить на ваш вопрос, ответ будет пустым. Оказывается, что в качестве значения для моего _id-ключа есть строка. Когда я включил отладку mongoose, [объяснил здесь] (https://stackoverflow.com/questions/18762264/log-all-queries-that-mongoose-fire-in-the-application), я заметил, что мангуста посылает: 'Mongoose: digitalassets.findOne ({_id: ObjectId (" 58969de160aa6d23823c9e69 ")}, {fields: undefined})', а значение в базе данных - строка. Таким образом, ответ будет пустым, потому что запрос не нашел значение 'ObjectId (" 58969de160aa6d23823c9e69 ")'. – negladiator