2017-10-05 15 views
0

私はカードモデルを持っており、私はIDで文書を探しているAPIを持っています。モデルを使用せずに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:あなたは2つのヘルパー関数を作成し、ルータから呼び出すことができますし、このようにそれを使用しています。両方の機能は、モデル・オブジェクトを受け入れる:

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); 
    } 
} 
関連する問題