2017-02-11 5 views
0

В настоящее время я использую 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? Я делаю что-то неправильно, и мне бы хотелось, чтобы еще одна пара глаз заглянула и посмотрела, что я сделала неправильно. Благодарим вас за продвижение за ваше время.

+0

Я играл с похожим кодом в течение нескольких часов, чтобы попытаться воспроизвести, но я не могу. Каков вывод 'console.log (response)' внутри 'then'' findByIdAndUpdate'? –

+0

@ 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

ответ

1

Оказалось, что в качестве значения для моего _id-ключа находится строка в базе данных. Когда я включил отладку mongoose, explained here, я заметил, что mongoose отправляет: Mongoose: digitalassets.findOne({ _id: ObjectId("58969de160aa6d23823c9e69") }, { fields: undefined }), а значением в базе данных является строка. Таким образом, ответ будет равен нулю, потому что запрос не нашел значение ObjectId("58969de160aa6d23823c9e69"). Я исправил проблему, обновив значения для ключей _id от строк до объектов, то есть ObjectId("58969de160aa6d23823c9e69").

Я подозреваю, что когда я создал локальную среду разработки баз данных и скопировать подмножество документов из моих живой базы данных для разработки баз данных, ObjectId значений были изменены строками, в результате чего вопроса о получении null ответов от метода Mongoose в findByIdAndUpdate(), выполненный в экспресс-маршрут PUT.

+0

А, я вижу. Я думал, что это может иметь какое-то отношение к автоматическому приложению 'findByIdAndUpdate' функции' ObjectId', но я не был уверен. Это был интересный вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^