node.js - countDocuments を機能させることができません

okwaves2024-01-24  6

ショッピング リストの商品数を返そうとしています。リスト自体と CRUD は正常に機能しますが、コレクション内のアイテムの合計数を返す API を取得できません。

私のセットアップは次のとおりです:

/_helpers/db.js

/* database config (Mongo Atlas)
/shopping/shopping.controller.js

const express = require("express");
const router = express.Router();

...

const shoppingService = require("./shopping.service");

// routes
router.get("/", authorize(), getAll, getNumberOfItems);
router.get("/:id", authorize(), getById);
router.post("/", authorize(), createSchema, create);
router.put("/:id", authorize(), updateSchema, update);
router.delete("/:id", authorize(), _delete);

module.exports = router;

...

function getNumberOfItems(req, res) {
  shoppingService.getNumberOfItems().then((result) => {
    res.json(result);
  });
}

...
/shopping/shopping.model.js

/* schema for shopping items
/shopping/shopping.service.js

const config = require("config.json");

...

const db = require("_helpers/db");

module.exports = {
  getAll,
  getById,
  getNumberOfItems,
  create,
  update,
  delete: _delete,
};

...

async function getAll() {
  const items = await db.Shopping.find();
  return items.map((x) => basicDetails(x));
}

...

async function getNumberOfItems() {
  return db.Shopping.countDocuments();
}

...
server.js

/* The server

Postman を使用して作成、読み取り、更新、削除を行うと、API は正常に動作します。コレクション内のドキュメントの数にアクセスしようとしても、何も返されません。グーグルで見つけた情報と照らし合わせてその方法を何十回も確認しましたが、何が間違っているのかわかりません。

誰かが私のどこが間違っているのか見てもらえますか?

2

その時点では、リソースは範囲外ではないでしょうか?

– ジョー

2020 年 9 月 3 日 3:49



------------------------

単にアイテム数を返すのではなく、getNumberOfItems で res を使用します。

次のようになります。

async function getNumberOfItems() {
  return db.Shopping.countDocuments();
}

次のように使用します:

function getNumberOfItems(req, res) {
  shoppingService.getNumberOfItems().then(result => {
    res.json(result)
  });
}

15

ありがとう。それで私は修正を加えてコードを配置しましたが、どういうわけか Postman はまだアイテム数の結果を受け取りません。なぜ JSON 応答を受信しないのか本当にわかりません。 GET / はリスト上の項目を返すだけで、getNumberOfItems 関数は無視されます。

– アンソニー

2020 年 9 月 3 日 17:32

では、res.json(result) 行にブレークポイントを設定すると、結果はどうなるでしょうか?

– アナトリー

9 月 3 日、2020 年 18 時 13 分

同じことです。 getAll からアイテムを返すだけで、getNumberOfItems は無視されます。

– アンソニー

2020 年 9 月 3 日 18:50

getAll では渡したり next を呼び出したりしないでください。そのため、次のミドルウェア getNumberOfItems が呼び出されません。

– アナトリー

2020 年 9 月 3 日 19:18

shopping.controller.js からすべてのコンテンツを貼り付けていませんが、次に getAll 関数が呼び出されます: function getAll(req, res, next) {shoppingService.getAll().then((items) => res.json(items)).catch(next);}

– アンソニー

2020 年 9 月 3 日 19:26

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。