【问题标题】:Why do I get "is not a function" error?为什么会出现“不是函数”错误?
【发布时间】:2018-02-16 13:19:14
【问题描述】:

我想为服务器应用程序编写测试类。我需要将我的路由器重构为控制器架构。 我在控制器的返回值上返回函数。但是在我的路由器上,我看到了错误。你有什么主意吗?我通过了哪一点?

控制器:

const express = require('express');

const controller = (Project) => {
    const projectMidlleware = require('../middleware/v1/projectMiddleware')(Project)
    const put = (req, res, next) => {
        projectMidlleware.create(req.query.name, (project) => {
            res.status(200).send(project.api_key);
            next();
        });
    }
    const findProject = (req, res, next) => {
        const apikey = req.headers["s-apikey"] || req.query.apikey || req.body.apikey;
        projectMidlleware.findByApikey(apikey, (err, project) => {
            if (err) {
                next({
                    message: err.message,
                    code: 500
                });
                return;
            }
            req.body.project = project;
            next();
        });
    }

    return {
        put,
        findProject
    }
}
module.exports = controller;

路由器:

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

const projectController = require('../../controllers/projectController');
const profileController = require('../../controllers/profileController');

//return profiles for project
router.get("/",
  projectController.findProject(),
  profileController.get()
);

module.exports = router;

【问题讨论】:

  • 你在哪里使用controller 在路由中? module.exports = { controller };
  • 刚试过,没效果。
  • const projectController = require('../../controllers/projectController')(); 你有一个函数,它返回一个带有方法的对象,但你没有调用该函数,并且方法存在于返回的对象上,而不是函数本身。
  • @JaredSmith 是对的。我认为这是一个奇怪的设计选择。
  • 我是 node 和 javascript 的新手。我用模块(路由器和一些中间件)编写了我的中间件。但是当我想编写测试时,我无法选择模式或者找不到最佳实践。我找到了有关复数视觉的教程(node-js-express-rest-web-services)。他像这样重构了他的对象。重构结束,他会将模拟对象传递给控制器​​......但是任何推荐都会很棒!

标签: javascript node.js express ecmascript-6


【解决方案1】:
const projectController = require('../../controllers/projectController')();

您有一个函数,它返回一个带有方法的对象,但您不调用该函数,并且方法存在于返回的对象上,而不是函数本身。这种模式在节点中相当常见,但为了清楚起见,我实际上会这样做:

const projectController = require('../../controllers/projectController');
const controller = projectController();

然后使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    相关资源
    最近更新 更多