2017-04-13 71 views
1

我做了一個API休息,我想用POSTMAN發出HTTP請求,特別是我想執行一個搜索或更新一個MongoDB文檔,但這必須是一個ID這是不是提供蒙戈使用findOne和findOneAndUpdate與HTTP請求(貓鼬)

模型架構

'use strict' 

const mongoose = require('mongoose') 
const Schema = mongoose.Schema 

const infoClientSchema = Schema ({ 
    idusr: String,       /*this is require*/ 
    name: String, 
    phone: Number, 
    address: String, 
    riff: String, 
    state: String, 
    city: String, 
    email: {type: String} 
}) 

module.exports = mongoose.model('InfoCli',infoClientSchema) 

控制器的DOC_ID(這是get方法,我知道用findById和工作)

'use strict' 

const InfoCli = require('../models/infoclient') 

function getInfoCli(req, res){ 
    let infocliId = req.params.infocliId 

    InfoCli.findById(infocliId, (err, infocli) =>{ 
     if (err) return res.status(500).send({message: 'Error making 
                request: $(err)'}) 

     if (!infocli) return res.status(404).send({message: 'The client does 
                   not exist '}) 

     res.status(200).send({infoclient: infocli})  
    }) 
} 

控制器(這是我想用findOne會工作get方法)

function getInfoByUsr(req, res){ 
    let idusr = req.body.idusr 

    InfoCli.findOne(idusr, (err, infocli) => { 
     if (err) return res.status(500).send({message: 'Error making 
                request: $(err)'}) 

     if (!infocli) return res.status(404).send({message: 'The client does 
                   not exist '}) 

     res.status(200).send({infoclient: infocli}) 

     console.log(infocli) /*The console is not showing anything*/ 
    }) 
} 

控制器(這是我想用findOneAndUpdate會工作put方法)

function updateByUsr(req, res){ 
    let idusr = req.body.idusr 
    let update = req.body 

    InfoCli.findOneAndUpdate(idusr, update, (err, infocliUpdate) => { 
     if (err) return res.status(500).send({message: 'Error making 
                request: $(err)'}) 

     if (!idusr) return res.status(404).send({message: 'The client does 
                   not exist '}) 

     res.status(200).send({infocliente: infocliUpdate}) 
    }) 
} 

路線(不是100%知道這個)

const express  = require('express') 
const InfoCliCtrl = require('../controllers/infoclient') 
const api   = express.Router() 

api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) /*working*/ 
api.get('/infoclient/:idusr', InfoCliCtrl.getInfoByUsr) 
+0

你在這裏有什麼問題? –

+0

簡單,findOne和findOneAndUpdate控制器和路由之間的正確方法是什麼?我只需要一個簡單的解決方案我的方法 – Rwa

回答

0

我認爲你只需要更改線路let idusr = req.body.idusrgetInfoByUsr()樂趣ction到let idusr = req.params.idusr

http://expressjs.com/en/api.html#req.body
http://expressjs.com/en/api.html#req.params

另外,請檢查您的findOnefindOneAndUpdate查詢語法(因爲idusr不是蒙戈_id但那種自定義字符串的id):

InfoCli.findOne({ idusr: idusr }, (err, infocli) => { ... 
InfoCli.findOneAndUpdate({ idusr: idusr }, update, (err, infocliUpdate) => {.. 

http://mongoosejs.com/docs/api.html#model_Model.findOne

+0

它仍然無法正常工作,但我試圖通過這些鏈接獲得解決方案,非常感謝 – Rwa

+0

也許我做錯了請求? http:// localhost:8080/api/infoclient/3010 – Rwa

+0

的確如此。看看我編輯的答案。 (你也需要改變你的路線模式,不要指向同一個地方) – TGrif

0

在你app.js/server.js

你應該有bodyparser安裝

api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) 
api.post('/infoclient/:idusr', InfoCliCtrl.updateByUsr) 

如果你將數據作爲URL參數,這樣/infoclient/:infocliId那麼你就可以訪問,使用req.params.infocliId

如果您使用POST正文傳遞,則可以使用req.body訪問數據。

在infoClient中。JS

要通過

GET獲取用戶數據

exports.getInfoCli = function(req, res, next){ 
    var incomingData = req.params.infocliId; 
    InfoCli.findOne({idusr: incomingData}, function(err, data){ 
    if(err){ 
     return res.status(500); 
    } else { 
     return res.status(200).send({infoclient: data}) 
    } 
    }); 
} 

調用上面的代碼 - http://localhost:port/infoclient/38742346343874234634是你infocliId你需要的路線傳遞

更新用戶數據

exports.updateByUsr = function(req, res, next){ 
    var userId = req.params.idusr; 
    var updateData = req.body; 

    InfoCli.findOneAndUpdate({idusr: userId}, updateData, {new: true }, function(err, data){ 
    if(err){ 
     return res.status(500); 
    } else { 
     return res.status(200).send(data) 
    } 
    }); 
} 

在我們使用{new : true}更新的代碼是從DB通過

POST方法返回更新的文檔

調用上面的代碼 - 數據在POST身體http://localhost:port/infoclient/3874234634所以你{name: 'pikachu', phone: 12345, ...}

使用req.paramsreq.body

0

使用req.params和正文數據讀取url參數中的userid謝謝大家,你的一個nswers幫助我糾正代碼中的許多事情。 問題是路由一個可怕的錯誤

看我是如何使用相同的路徑有兩個請求

api.get('/infoclient/:infocliId', InfoCliCtrl.getInfoCli) /*working*/ 
api.get('/infoclient/:idusr', InfoCliCtrl.getInfoByUsr) 

的問題是,當我使用的標識符idusr它是在衝突在的ObjectId搜索

現在

api.get('/infoclient/idusr/:idusr', InfoCliCtrl.getInfoByUsr)