在单独模块中检索对象数据的正确方法

时间:2018-09-13 19:37:32

标签: node.js sequelize.js feathersjs

我正在开发一个API,它也可以用作电报机器人。我需要检索所有telegram-user以便对其发出警报。

const TelegramBot = require('node-telegram-bot-api');
const express = require('express');
const router = express.Router();
const config = require('../config/production.json');
const TOKEN = config.bot.token;
const bot = new TelegramBot(TOKEN);

const app = require('./app.js');
const users = app.service('telegram-user');

router.post(`/${TOKEN}`, (req, res) => {
  bot.processUpdate(req.body);
  res.sendStatus(200);
});


bot.onText(/\/registrar/, async function onStartText(msg) {
  users.create({
    id: msg.chat.id,
    first_name: msg.chat.first_name
  }).catch(() => {
    bot.sendMessage(msg.chat.id, 'Usuario ya registrado');
  });
  bot.sendMessage(msg.chat.id, 'Registrado correctamente');
});

我尝试了几种使const'users'工作的方法,但是我不确定或者app.service不是函数。

我还尝试过用{p>更改require('.app.js')

const feathers = require('@feathersjs/feathers');
const express = require('@feathersjs/express');
const app = express(feathers());

如果我在app.js中运行此确切的代码,它将起作用:

const users = app.service('telegram-user');
users.create({
    id: msg.chat.id,
    first_name: msg.chat.first_name
  })

我在Sequelize和Postgresql中使用feathersjs

更新: 如果我将require('.app.js')放在函数内,则可以使用,但是如果我将其放在失败的开头,则会收到“ app.service不是函数”。

这有效:

bot.onText(/\/registrar/, async function onStartText(msg) {
    const app = require('./app.js');  //require in here
    const users = app.service('telegram-user');
    users.create({
            id: msg.chat.id,
            first_name: msg.chat.first_name
    }).catch(() => {
            bot.sendMessage(msg.chat.id, 'Usuario ya registrado');
        });
    bot.sendMessage(msg.chat.id, 'Registrado correctamente');
});

如何在文件中将app设置为const变量?

1 个答案:

答案 0 :(得分:0)

问题是我有一个循环依赖性,使得require('.app.js')返回一个空对象。解决方案是将已加载第一个代码段的require移动到app.js的底部,以便在app加载require('.app.js')之前完全启动 var linkExtent = d3.extent(energy.links, function (d) {return d.value}); var frequencyScale = d3.scale.linear().domain(linkExtent).range([0.05,1]); var particleSize = d3.scale.linear().domain(linkExtent).range([1,5]); energy.links.forEach(function (link) { link.freq = frequencyScale(link.value); link.particleSize = 2.5; link.particleColor = d3.scale.linear().domain([0,1]) .range([link.source.color, link.target.color]); })