2017-10-05 79 views
0

我有卡模型,我有一個API,我正在通過ID查找文檔。如何通過ID更新文檔,而不使用模型

app.post("/api/postcomment", async (req,res) => { 
    const data = req.body 
    const reqUrl = req.headers.referer 
    const re = new RegExp('([a-zA-Z0-9]*$)', 'i') 
    const fixedUrl = reqUrl.match(re) 

    try { 
    await Card.update({_id: fixedUrl}, {$push:{'comments': data}}) 
    const card = await Card.findById(fixedUrl) 
    return res.json(card) 
    } catch (err) { 
    throw err 
    } 
}) 

它工作正常。但現在我有更多的模型。所有人都應該以同樣的方式對待他們。但是,我怎樣才能讓這個代碼對於每一個模型都是可重用的? 或者也許有辦法將我的模型的名稱傳遞給API?然後用它是這樣的:

app.post("/api/postcomment", async (req,res, modelName) => { 
    const data = req.body 
    const reqUrl = req.headers.referer 
    const re = new RegExp('([a-zA-Z0-9]*$)', 'i') 
    const fixedUrl = reqUrl.match(re) 

    try { 
    await modelName.update({_id: fixedUrl}, {$push:{'comments': data}}) 
    const item = await modelName.findById(fixedUrl) 
    return res.json(item) 
    } catch (err) { 
    throw err 
    } 
}) 

回答

0

解決方法1:您可以創建兩個輔助功能,從路由器調用。兩個函數接受模型對象:

let updateDocument = (model, fixedUrl, data) => { 
    return model.update({ _id: fixedUrl }, { $push: { comments: data }}) 
} 

let getDocument = (model, fixedUrl) => { 
    return model.findById(fixedUrl) 
} 

app.post("/api/postcomment", async (req, res, modelName) => { 
    const data = req.body 
    const reqUrl = req.headers.referer 
    const re = new RegExp('([a-zA-Z0-9]*$)', 'i') 
    const fixedUrl = reqUrl.match(re) 

    try { 
    await updateDocument(Card, fixedUrl, data) 
    const item = await getDocument(Card, fixedUrl) 
    return res.json(item) 
    } catch (err) { 
    throw err 
    } 
}) 

溶液2:的更好的解決方案是創建一個基類(服務),與普通功能。並將其擴展爲每種型號:

class BaseService { 
    constructor(model) { 
    this.model = model; 
    } 

    getDocument(data) { 
    return this.model.findOne(...); 
    } 

    updateDocument(data) { 
    return this.model.update(...); 
    } 
} 

class CardService extends BaseService { 
    constuctor() { 
    super(Card); 
    } 
} 
相關問題