2016-12-15 55 views
1

我尝试使用电子(为网站和桌面应用程序),使web应用和表达(用于会议等)电子的NodeJS与快递

现在,我得到这个作为我app.js:

const express = require('express'); 
const {app, BrowserWindow} = require('electron'); 

exp = express(); 
exp.set('views', __dirname + '/views/'); 
exp.use(express.static(process.cwd() + '/views')); 
exp.get('/', function(req, res) { 
    res.render('index', {}); 
}); 

function onAppReady() 
{ 
    mainWindow = new BrowserWindow({ 
     width: 1080, 
     height: 720, 
     autoHideMenuBar: true, 
     useContentSize: true, 
     resizable: false 
    }); 

    mainWindow.loadURL('http://localhost:5000/'); 
    mainWindow.focus(); 
    mainWindow.webContents.openDevTools(); 
} 

app.on('ready', onAppReady); 

现在,有几个问题:

  1. 如果我使用node app.js,我得到这个错误: 行:app.on('ready', onAppReady);

    TypeError:无法读取Object上未定义的 属性'on'。 (module.js:571:32) at Object.Module._extensions..js(module.js:580:10)(/home/josh/chat_program/client/app.js:26:4) at Module._compile )在Module.load(module.js:488:32) at try.ModuleLoad(module.js:447:12) at Function.Module._load(module.js:439:3) at Module.runMain(module的.js:605:10) 在运行(bootstrap_node.js:420:7)在启动时 (bootstrap_node.js:139:9) 在bootstrap_node.js:535:3

  2. 如果我使用electron .,应用程序启动,但我没有得到请求或网页。我所得到的只是基本的HTML,没有任何东西(只有DOCTYPE HTML HEAD和BODY)。

我搜索了很长时间,但找不到任何东西。

+0

你需要分开你后端和前端部分 – MysterX

+0

mmh你的例子在这里工作没有问题...(电子) –

+0

是的,它的工作原理,但它没有给我一个请求。 –

回答

2

两件事。

首先我想澄清你的寻路设置和使用,更是这样的:

var publicPath = path.resolve(__dirname, '/views'); 
// point for static assets 
app.use(express.static(publicPath)); 
//view engine setup 
app.set('views', path.join(__dirname, '/views/')); 

app.engine('html', require('ejs').renderFile); 
app.set('view engine', 'html'); 

其次,我想包我所有的快件代码到一个单一的文件,该文件是一个自动执行的功能,所以它运行一次当你需要它。比如我的快递文件,我打电话给我的app.js文件:

(function() { 
    'use strict'; 

    var express = require('express'); 
    var path = require('path'); 
    var logger = require('morgan'); 
    var cookieParser = require('cookie-parser'); 
    var bodyParser = require('body-parser'); 
    var routes = require('./routes.js'); 

    var app = express(); 
    var publicPath = path.resolve(__dirname, '../dist'); 
    var port = 3000; 

    // point for static assets 
    app.use(express.static(publicPath)); 

    //view engine setup 
    app.set('views', path.join(__dirname, '../dist')); 
    app.engine('html', require('ejs').renderFile); 
    app.set('view engine', 'html'); 

    app.use(logger('dev')); 
    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({ 
     extended:true 
    })); 

    app.use('/', routes); 

    app.use(cookieParser()); 

    var server = app.listen(port, function() { 
     console.log('Express server listening on port ' + server.address().port); 
    }); 

    module.exports = app; 

}()); 

然后在我的主文件(我称之为main.js不app.js,在我的情况),我实例化应用程序和Express服务器,如下所示:因此,可能需要

var app = require('electron').app; 
var Window = require('electron').BrowserWindow; // jshint ignore:line 
var Tray = require('electron').Tray; // jshint ignore:line 
var Menu = require('electron').Menu; // jshint ignore:line 
var fs = require('fs'); 

var server = require('./ServerSide/app'); 

var mainWindow = null; 

app.on('ready', function() { 
    'use strict'; 

    var path = require('path'); 
    var iconPath = path.resolve(__dirname, './dist/myicon.ico'); 
    const appIcon = new Tray(iconPath); 
    mainWindow = new Window({ 
     width: 1280, 
     height: 1024, 
     autoHideMenuBar: false, 
     useContentSize: true, 
     resizable: true, 
     icon: iconPath 
     // 'node-integration': false // otherwise various client-side things may break 
    }); 
    appIcon.setToolTip('My Cool App'); 
    mainWindow.loadURL('http://localhost:3000/'); 

    // remove this for production 
    var template = [ 
     { 
      label: 'View', 
      submenu: [ 
       { 
        label: 'Reload', 
        accelerator: 'CmdOrCtrl+R', 
        click: function(item, focusedWindow) { 
         if (focusedWindow) { 
          focusedWindow.reload(); 
         } 
        } 
       }, 
       { 
        label: 'Toggle Full Screen', 
        accelerator: (function() { 
         if (process.platform === 'darwin') { 
          return 'Ctrl+Command+F'; 
         } else { 
          return 'F11'; 
         } 
        })(), 
        click: function(item, focusedWindow) { 
         if (focusedWindow) { 
          focusedWindow.setFullScreen(!focusedWindow.isFullScreen()); 
         } 
        } 
       }, 
       { 
        label: 'Toggle Developer Tools', 
        accelerator: (function() { 
         if (process.platform === 'darwin') { 
          return 'Alt+Command+I'; 
         } else { 
          return 'Ctrl+Shift+I'; 
         } 
        })(), 
        click: function(item, focusedWindow) { 
         if (focusedWindow) { 
          focusedWindow.toggleDevTools(); 
         } 
        } 
       }, 
      ] 
     } 
    ]; 

    var menu = Menu.buildFromTemplate(template); 
    Menu.setApplicationMenu(menu); 

    mainWindow.focus(); 

}); 

// shut down all parts to app after windows all closed. 
app.on('window-all-closed', function() { 
    'use strict'; 
    app.quit(); 
}); 

请注意,我用这与在Windows平台上的成功,小的调整在这个例子中列出的任何平台的具体项目。