简体   繁体   English

从文件导入 function 时,Nodejs 返回未定义

[英]Nodejs returns undefined when importing function from file

im kinda new to nodejs and trying to get this here working, but whatever I try it either return undefined or [function: online].我对 nodejs 有点陌生,并试图让它在这里工作,但无论我尝试什么,它要么返回 undefined 要么返回 [function: online]。 As you can see ive made a function in online.js and export the function. Then in app.js I require the file, then console log the const如您所见,我在 online.js 中创建了一个 function 并导出了 function。然后在 app.js 中我需要该文件,然后控制台记录 const

// app.js

var express = require('express');
var app = express();
app.set('view engine', 'ejs');
var PORT = 3000;
const online = require('./online');

app.use('/public', express.static('./public/'));
app.get('/', function(req, res) {
  res.status(200);
  res.render('index');
});

app.listen(PORT, function(err) {
  if (err) console.log(err);
  console.log("Server listening on PORT", PORT);
  console.log(online);
});
// online.js

function online() {
  var steamServerStatus = require('steam-server-status');
  steamServerStatus.getServerStatus(
    'oslo14.spillvert.no', 28215, function onlinePlayers(serverInfo) {
    if (serverInfo.error) {
      console.log(serverInfo.error);
    } else {
      console.log("game: " + serverInfo.gameName);
      console.log("server name: " + serverInfo.serverName);
      console.log("players: " + serverInfo.numberOfPlayers + "/" + serverInfo.maxNumberOfPlayers);
    }
  })
};

module.exports = online();

When running app.js I get this output:运行app.js时,我得到这个 output:

Server listening on PORT 3000 
undefined

You don't know whether getServerStatus succeeded or failed until the callback function is called.直到调用回调 function 才知道getServerStatus是成功还是失败。 So you should return a Promise from your online function and resolve that promise in the onlinePlayers callback.因此,您应该从online function 返回 Promise,并在onlinePlayers回调中解析该 promise。 You can await it from any async function (ie: make your app.listen callback async ).您可以从任何异步 function 等待它(即:让您的app.listen回调异步)。 The reject path will cause an exception where the online() call was awaited.拒绝路径将导致等待online()调用的异常。

app.listen(PORT, async function(err){
    if (err) console.log(err);
    console.log("Server listening on PORT", PORT);
    console.log(await online());
}
function online() {
  return new Promise((resolve, reject) => {
    var steamServerStatus = require('steam-server-status');
    steamServerStatus.getServerStatus(
      'oslo14.spillvert.no', 28215, function onlinePlayers(serverInfo) {
        if (serverInfo.error) {
          reject(serverInfo.error);
        } else {
          console.log("game: " + serverInfo.gameName);
          console.log("server name: " + serverInfo.serverName);
          console.log("players: " + serverInfo.numberOfPlayers + "/" + 
serverInfo.maxNumberOfPlayers);
          resolve(serverInfo); // or 'true' or whatever you wanted to log
        }
      });
  });
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM