2017-05-19 62 views
0

我目前正在學習JavaScript/NodeJS/electron,並且我想要構建一個小型演示者應用程序來遠程控制PPT演示文稿。NodeJS Ajax請求正好工作七次

我設置使用電子這樣的服務器:

const electron = require('electron'); 
const robot = require("robotjs"); 
const fs = require('fs'); 
const express = require('express'); 
const cors = require('cors'); 

const { 
    app, 
    BrowserWindow 
} = electron; 

var mainWin = null; 
var contentString; 

app.on('ready', function() { 
    mainWin = new BrowserWindow({ 
    width: 800, 
    height: 600 
    }); 

    contentString = ""; 

    // Remove Menu-Bar 
    mainWin.setMenu(null); 

    const port = 3000; 

    var app = express(); 
    app.use(cors()); 

    app.post('/remote/forward', function(request, response, next) { 
    var ip = getRemoteIP(request); 
    log(mainWin, "presenter - forward"); 
    robot.keyTap("right"); 
    }); 

    app.post('/remote/backward', function(request, response, next) { 
    var ip = getRemoteIP(request); 
    log(mainWin, "presenter - backward"); 
    robot.keyTap("left"); 
    }); 


    app.listen(port, function() { 
    log(mainWin, 'server listening on port ' + port); 
    }); 
}); 


function log(mainWin, text) { 
    contentString += getFormattedDate() + " " + text; 
    contentString += "<br />"; 
    mainWin.loadURL("data:text/html;charset=utf-8," + encodeURI(contentString)); 
} 

我把這些有兩個JS-功能:

function sendForwardRequest() { 
    $.ajax({ 
    type: 'POST', 
    data: { 
     blob: {action:"forward"} 
    }, 
    contentType: "application/json", 
    dataType: 'json', 
    url: 'http://192.168.2.110:3000/remote/forward', 
    success: function(data) { 
     console.log('success'); 
    }, 
    error: function(error) { 
     console.log("some error in fetching the notifications"); 
    } 
    }); 
} 

function sendBackwardRequest() { 
    $.ajax({ 
    type: 'POST', 
    data: { 
     blob: {action:"backward"} 
    }, 
    contentType: "application/json", 
    dataType: 'json', 
    url: 'http://192.168.2.110:3000/remote/backward', 
    success: function(data) { 
     console.log('success'); 
    }, 
    error: function(error) { 
     console.log("some error in fetching the notifications"); 
    } 
    }); 
} 

我敢肯定,這個解決方案是相當miserble,如我說,我目前正在學習這一點。我現在的問題是:這個工作正好七次。之後,我必須重新加載我的客戶端瀏覽器。我怎樣才能解決這個問題?另外,對於這些請求,更好的解決方案是什麼?我想只有一個app.post() - 方法,並使用給定的後置參數。最後一個問題:什麼可能是更好的記錄方法?我想將內容追加到我的窗口,而不是每次都重新加載整個字符串。

非常感謝!

+0

只是爲了簡化,你不需要'POST',使用'GET'。你爲什麼要發送'data:{blob:..}'?你可以通過url – Jag

+0

@Jag來告訴它的前進或後退,如我所說,我認爲使用這個任務的一個url並使用數據指定類型會更好。但是你當然是對的,如果你想爲每個函數使用不同的URL。 – Marcel

+0

注意:我只是將請求更改爲GET,這允許我只調用一次請求。我只是從app.post更改爲app.get並設置了要獲取的類型。我還需要額外做些什麼嗎? – Marcel

回答

1

這是您的代碼的縮小版本。試試看看它是否仍然只發射7次

/* Server side */ 

    // instead of two app.post functions, use this one 
    app.get('/remote/:key', function(request, response, next) { 
    var ip = getRemoteIP(request); 
    log(mainWin, "presenter - " + request.params.key); 
    robot.keyTap(request.params.key); 
    response.send(request.params.key + ' key pressed'); 
    }); 

/* Client Side */ 

function sendKey(key) { 
    return $.get('http://192.168.2.110:3000/remote/' + key) 
} 

// to send right key 
sendKey('right').done(function(response) { /*success*/ }).fail(function(error) { /*error*/ }); 
+0

感謝您的支持!這工作一次,之後,我必須重新加載頁面。重新加載後,我在/ * error */- 部分創建的代碼被執行兩次。你有一個想法可能會有什麼問題嗎? – Marcel

+0

編輯:沒關係,那是我需要一個迴應,就像你編輯!非常感謝你! – Marcel