Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 34

0
votes
answers
8 views
+10

在Node v8(v8.9.3或更高版本)中,commonjs需要模塊創建新的上下文

0

我們正在研究帶有helpers(Dust.js)的模板庫,該輔助庫在代碼庫中具有以下設計模式。在Node v8(v8.9.3或更高版本)中,commonjs需要模塊創建新的上下文

(function(root, factory) { 
    if (typeof define === 'function' && define.amd && define.amd.dust === true) { 
    define(['dust-linkedin'], factory); 
    } else if (typeof exports === 'object') { 
    module.exports = factory(require('dust-linkedin')); 
    // module.exports = factory; // <<--- This is working on v8 
    } else { 
    factory(root.dust); 
    } 
}(this, function (dust) { 
... 
}); 

在節點V6,出口工廠(要求(「塵埃LinkedIn」))工作正常,但切換到節點V8(v8.9.3)之後,我們看到的助手都沒有得到執行,改變廠(require('dust-linkedin'))工廠裏面的幫助程序庫裏,東西開始工作。

在節點v8中,require('dust-linkedin')是否會創建一個新的上下文/對象,因此我們失去了所有的助手? commonjs中有沒有需要改變的行爲?

+0

我已經使用了許多使用UMD模式的庫。從節點6到節點8沒有任何問題。請編輯您的問題以詳細說明您希望發生的事情,以及發生了什麼*而不是*。如果發生異常,請發佈完整的堆棧跟蹤。其實,你應該編輯你的問題,讓人們重現問題([mcve])。你說的「有效」的註釋代碼並不是正確的。 – Louis

+0

感謝Louis指出,會修改這個問題 –

+0

[dust-helpers]的代碼(https://github.com/linkedin/dustjs-helpers/blob/master/dist/dust-helpers.js)有'module .exports.registerWith = factory;''module.exports = factory(require('dust-linkedin'));'但你顯示的代碼沒有它。 – Louis

沙发
0
0

該解決方案在PR中已修復https://github.com/krakenjs/festucam/pull/4

0
votes
answers
8 views
+10

從Linux上的NodeJS打印到Star TSP143LAN,格式爲

0

我已經安裝了適當的CUPS驅動程序:我可以使用任何具有打印功能的應用程序(如Chrome)打印到我的Star TSP143LAN。我可以使用節點打印機模塊通過指定打印機名稱或打印機的網絡地址以及將打印模式設置爲TEXT來打印到此打印機。從Linux上的NodeJS打印到Star TSP143LAN,格式爲

但我似乎無法格式化使用節點打印機庫從NodeJS打印的內容。如果我將模式設置爲RAW併發送命令,如本打印機的Star命令行模擬器手冊中所指定的那樣,節點打印機將報告成功的打印,但沒有任何反應。它不打印。

我試圖發送這些RAW命令,因爲我想進行各種格式化操作,如使字體變大或變粗等等。

我試過節點熱敏打印機模塊,但我沒有運氣。

我一直在網上搜尋一些關於這個問題的幫助,但是我一直沒能找到太多。我已經看到它提到TSP143局域網不像其他明星產品那樣進行通信,最好使用Star的驅動程序作爲中介,但我不確定這意味着什麼。 (當我試圖從節點打印機打印時指定打印機的類名稱時,我想我可能已經這麼做了......)

我沒有太多的麻煩將Star Swift SDK安裝到iOS應用程序中並進行格式化那裏的操作。但我需要從Linux上的NodeJS環境打印。我很茫然。

如果有任何人向誰這聽起來很熟悉,可以點我在正確的方向,我會非常感激......

謝謝!

沙发
0
0

經過相當多的研究後,它看起來像Star TSP100/TSP143 LAN無法使用線路模式命令或Linux的ESC/POS進行打印:解決方案是從HTML生成PDF(使用wkhtmltopdf)然後使用節點打印機庫(https://github.com/tojocky/node-printer)打印PDF。我還沒有找到更好的方式來正確格式化打印。

0
votes
answers
8 views
+10

如何使用NodeJS在S3 Bucket上上傳CSV文件?

0

我從JSON內容中即時創建一個CSV文件,並在S3存儲區上傳生成的CSV文件,而不是先在本地保存文件。如何使用NodeJS在S3 Bucket上上傳CSV文件?

下面是我的代碼片段,使用下面的代碼我上傳到S3存儲桶的CSV文件,但它似乎並不是正確的CSV格式。

var uploadCSVFileOnS3Bucket = function(next, csvFileContent,results) { 
console.log("uploadCSVFileOnS3Bucket function started"); 
var bufferObject = new Buffer.from(JSON.stringify(csvFileContent)); 
var filePath = configurationHolder.config.s3UploadFilePath; 
var s3 = new AWS.S3(); 
var params = { 
    Bucket: 'bucket_name' 
    Key: 's3UploadFilePath', 
    Body: bufferObject, 
    CacheControl:'public, max-age=86400' 
} 
s3.upload(params, function(err, data) { 
    if (err) { 
     console.log("Error at uploadCSVFileOnS3Bucket function",err); 
     next(err); 
    } else { 
     console.log("File uploaded Successfully"); 
     next(null, filePath); 
    } 
}); 

};

此外,我使用「json2csv」npm模塊從JSON生成csv文件內容。

下面是代碼:

var generateCSVFile = function(next,callback,csvFileContent) { 
    console.log("generateCSVFile function started",csvFileContent); 
    if(csvFileContent && csvFileContent.length>0) { 
    var fields = ['field1','field2','field3',........]; 
    var csv = json2csv({ data: csvFileContent, fields: fields }); 
    console.log('created',csv); 
    next(null,csv); 
    } 
    else { 
    next(null,[]); 
    } 
} 

請讓我們知道上面的代碼是怎麼了。

沙发
0
0

在你的params中添加ContentDisposition:'attachment'。

否則,你也可以閱讀文件並上傳到S3

fs.readFile(FILEPATH, function(err, file_buffer) { 
      var params = { 
       Bucket: //bucketname, 
       Key:key, 
       ContentDisposition: 'attachment', 
       Body: file_buffer 
      }; 
      s3.upload(params, function(err, data) { 
       if (err) { 
        console.log("Error in upload"); 
        callback(err, null) 
       } 
       if (data) { 
        console.log("Upload Success", data); 
        callback(null, data) 
       } 
      }); 
}); 
+0

我試過使用上面的標題,但它沒有提供給我正確的結果。 –

+0

你能ping我錯誤 – Vipul

+0

嗨我再次嘗試使用上述標題,它的工作原理,我在一個單獨的評論中添加了整個代碼。謝謝 –

板凳
0
1

您好我下面報頭值再次嘗試,它爲我工作。下面是代碼:

var s3 = new AWS.S3(); 
var params = { 
    Bucket: bucketName, 
    Key: filePath, 
    Body: csvFileContent, 
    ContentType: 'application/octet-stream', 
    ContentDisposition: contentDisposition(filePath, { 
     type: 'inline' 
    }), 
    CacheControl: 'public, max-age=86400' 
} 
s3.putObject(params, function(err, data) { 
    if (err) { 
     console.log("Error at uploadCSVFileOnS3Bucket function", err); 
     next(err); 
    } else { 
     console.log("File uploaded Successfully"); 
     next(null, filePath); 
    } 
}); 
0
votes
answers
8 views
+10

HapiJS路由問題

0

我有一個routes.js這樣的:HapiJS路由問題

server.route({ 
    method: 'GET', 
    path: '/marvel/universal/verify/{serial?}', 
    handler: function(request, h) { 
    let obj = { "test": "a" }; 
    Db.find('marvel', obj, 1, function(result) { 

    }); 
     return h.response(result); 
    } 
}); 

和使用官方的MongoDB包節點像這樣的鉤到MongoDB的一個數據庫模塊:

function find(collection, data, limit, callback) { 
    mongo.db.collection(collection).findOne(data, function(err, r) { 
    callback(r); 
    }); 
} 

很顯然,我可以」牛逼從匿名函數callback返回結果我憑什麼結果傳遞給h.reponse(result)

+0

你可以這樣做,因爲它是包裹的匿名函數處理程序中,僅當您的回調 –

+0

中調用h.response'h.response'是不是在回調可用。 –

+0

我認爲h.response可用,你試過了嗎? –

沙发
0
1

一些調試後,高致病性禽流感可以讓你回到一個承諾,所以返回結果中承諾的作品!

server.route({ 
    method: 'GET', 
    path: '/marvel/universal/verify/{serial?}', 
    handler: function(request, h) { 
     let obj = { "test": "a" }; 
     return new Promise(function(resolve,reject){ 
     Db.find('marvel', obj, 1, function(result) { 
      resolve(h.response(result)); 
     }); 
     }); 
    } 
}); 
+0

當你返回h.response(undefined)時會發生什麼?結果的價值是什麼? –

+0

什麼是爲此事h值,我更新了我什麼,我建議代碼。雖然我也建議你使用Node.js的調試器,看看該回調內部的變量,看他們是否正在定義或不 –

+0

'request'和'h'做工精細,當他們是'Db.find外'...包裝。一旦他們在這個匿名函數中,他們將失去訪問權將數據返回到'handler'的詞法上下文中。 –

0
votes
answers
7 views
+10

nodejs應用程序在重啓後無法正常啓動

3

我有一個nodejs應用程序,我想在服務器重啓後自動重啓。我已經創建了一個腳本來永久啓動應用程序,如下所示。nodejs應用程序在重啓後無法正常啓動

#!/bin/sh 
export PATH=/usr/bin:$PATH 
forever start --command node --minUptime 1000 --spinSleepTime 10000 --sourceDir /etc/csc server.js >> /etc/csc/log.txt 2>&1 

我還創建了一個crontab項目重新啓動後運行該腳本:

@reboot /etc/csc/csc-starter.sh 

雖然,我不認爲在crontab部分是真正相關的,因爲我會在下面解釋。問題是,雖然nodejs應用程序在重新啓動後確實啓動,但它不會正確響應客戶端請求。例如,被顯示(在瀏覽器中)的URL的調用應導致應用程序的主視圖,在下面的輸出結果:

{ 
code: "ResourceNotFound", 
message: "/" 
} 

有趣的是,當調用的被觀察到的相同輸出手動啓動腳本。但是,如果我用以下方式運行nodejs應用程序:

node /etc/csc/server.js 

它工作得很好。我是Linux的相對新手,你可以放心地假設,我可能並不知道一些在Linux中工作的可接受真理,比如將應用程序放在/ etc下的合理性。

任何想法爲什麼永遠啓動應用程序會改變它的內部行爲?這個應用程序非常簡單。它基於restify並且有幾條REST路線,以及託管靜態內容,但它確實沒什麼特別。

謝謝。

沙发
0
3

/etc可能不是您的應用程序的最佳位置。儘管這與你的問題沒有直接關係。

當您從命令行手動啓動應用程序時,您可能已經位於/ etc/csc目錄中。

嘗試添加目錄更改爲你的啓動腳本:

#!/bin/sh 
export PATH=/usr/bin:$PATH 
cd /etc/csc 
forever start --command node --minUptime 1000 --spinSleepTime 10000 --sourceDir /etc/csc server.js >> /etc/csc/log.txt 2>&1 

該應用可能配置爲使用一個子目錄關閉其靜態資源的當前目錄。

-

你應該考慮把你的應用程序在/ opt/CSC。這是第三方應用程序更通用的地方。/etc更多用於系統配置。

+0

感謝您的快速響應。我添加了更改目錄,一切都很好!我想我已經想了很多關於永遠會爲我做些什麼,特別是因爲它需要一個sourceDir參數。活到老,學到老。 (並且我將該應用程序移至/ opt/csc,感謝該技巧)。 – lje 2014-11-01 21:42:32

板凳
0
0
/etc/csc server.js >> 

刪除路徑中的空間。

/etc/csc/server.js >> 
0
votes
answers
7 views
+10

命令超時| Discord.js

2

目前我有這樣的:命令超時| Discord.js

const Discord = require("discord.js"); 
const PREFIX = ","; 
const token = "my token"; 
var bot = new Discord.Client(); 
bot.on('ready',() => { 
    bot.on('message', message => { 
     if (!message.content.startsWith(PREFIX)) return; //if not command ignore message 

     var args = message.content.substring(PREFIX.length).split(" "); //splits commands so each word = pos in array 

     switch (args[0].toLowerCase()) { //not case-sensitive anymore 

      case "hello": 
       message.channel.send("hello"); 
       break; 

      //rest of the commands 

我想限制命令「你好」的用法。我希望每次用戶輸入「hello」時都會有10秒的超時時間。如果用戶在冷卻前輸入命令,它會發送一條消息,說明誰最後使用了該命令,以及冷卻時間還剩多長時間。

這就是我想要的結果看起來像:

User1:   ,hello 
Bot:    hello 

(After 1 second) 

User2:   ,hello 
Bot:   User1 has already used this command, please wait another 9 seconds to use it again 

(After 9 seconds) 

User 2:   ,hello 
Bot:   hello 

所有幫助表示讚賞。 謝謝,

沙发
0
1

您需要存儲該命令的最後日期,然後相應地分流。爲了顯示最後一次使用該命令的人員,您需要將該信息與時間戳一起存儲。

下面是一個例子基於你:

const Discord = require("discord.js"); 
const PREFIX = ","; 
const token = "my token"; 
const bot = new Discord.Client(); 

let lastHelloCommandDate, lastHelloCommandUser; 

bot.on('ready',() => { 
    bot.on('message', message => { 
     if (!message.content.startsWith(PREFIX)) return; //if not command ignore message 

     var args = message.content.substring(PREFIX.length).split(" "); //splits commands so each word = pos in array 

     switch (args[0].toLowerCase()) { //not case-sensitive anymore 

      case "hello": 
       hello(message); 
       break; 

      //rest of the commands 
    }}}) 
}) 

function hello(message) { 
    const now = new Date(); 
    if (now - lastHelloCommandDate > 10 * 60 * 1000) { 
    // It's been more than 10 mins 
    message.channel.send("hello"); 
    lastHelloCommandDate = now; 
    lastHelloCommandUser = message.sender; 
    } else { 
    // It's been less than 10 mins 
    // send a direct message to the user 
    // i don't know if message.sender exists, check the api 
    message.sender.send(`Command last used by ${lastHelloCommandUser}`); 
    } 

} 

將該樣品再加工,使得命令存儲在一個單獨的對象和動態檢查。這消除了對switch語句的需要。

const Discord = require("discord.js"); 
const PREFIX = ","; 
const token = "my token"; 
const bot = new Discord.Client(); 

let lastHelloCommandDate, lastHelloCommandUser; 

bot.on('ready',() => { 
    bot.on('message', message => { 
     if (!message.content.startsWith(PREFIX)) return; //if not command ignore message 

     var args = message.content.substring(PREFIX.length).split(" "); //splits commands so each word = pos in array 
     const command = args[0].toLowerCase(); 

     if (!commands[command]) { 
      throw new Error(`Unknown command supplied: ${command}`); 
     } 
     commands[command](message); 
    }}}) 
}) 

const commands = { 
    hello: message => { 
    const now = new Date(); 
    if (now - lastHelloCommandDate > 10 * 60 * 1000) { 
     // It's been more than 10 mins 
     message.channel.send("hello"); 
     lastHelloCommandDate = now; 
     lastHelloCommandUser = message.sender; 
    } else { 
     // It's been less than 10 mins 
     // send a direct message to the user 
     // i don't know if message.sender exists, check the api 
     message.sender.send(`Command last used by ${lastHelloCommandUser}`); 
    } 
    } 
}; 
+0

是的,'lastHelloCommandDate'應該初始化爲'0'。如果它是'undefined'(如上所述),則結果爲'new Date() - undefined',這會導致'NaN'(不會超過任何數字)。 –

0
votes
answers
7 views
+10

錯誤:發送後無法設置標題。

-2

錯誤:發送後無法設置標題。我討厭這個問題,因爲得到它很多次,儘管我發現我的錯誤,但我錯了。 好的,這是我的代碼。錯誤:發送後無法設置標題。

const mongoose = require ("mongoose"); 
const Spec = require("./specialist"); 
const Person = require("./person"); 
const Company = require("./company"); 
const bcrypt = require("bcryptjs"); 

module.exports.findUser=function(username,callback){ 
    let query = {email_num:username}; 
    Spec.findOne(query,(err_spec,spec_user)=>{ 
     if(err_spec) throw err_spec; 
     if(!spec_user){ 
      Person.findOne(query,(err_person,person_user)=>{ 
       if(err_person) throw err_person; 
       if(!person_user){ 
        Company.findOne(query,(err_company,company_user)=>{ 
         if(err_company) throw err_company; 
         if(!company_user){ 
          return console.log("Error User Not Found"); 
         } 
         return callback(null,company_user); 
        }); 
       } 
       return callback(null,person_user); 
      }); 
     } 
     return callback(null,spec_user); 
    }); 
}; 
module.exports.comparePassword = function(candidatePassword, hash, callback){ 
    bcrypt.compare(candidatePassword, hash, (err, isMatch) => { 
    if(err) throw err; 
    callback(null, isMatch); 
    }); 
}; 
module.exports.saveToken = function(username,role,token,callback){ 
    let query = {email_num:username}; 
    let updateToken={updatedToken:token}; 
    if(role==="Person-User"){ 
     Person.findOneAndUpdate(query,updateToken,callback); 
    }else if(role==="Specialist-User"){ 
     Spec.findOneAndUpdate(query,updateToken,callback); 
    }else if(role==="Company-User"){ 
     Company.findOneAndUpdate(query,updateToken,callback); 
    }else{ 
     console.log("Something went goes wrong"); 
    } 

} 

我已創建3個集合,並且此文件用於處理它們全部。 這是我的主要服務器代碼。

const express = require("express"); 
const mongoose = require("mongoose"); 
const bodyParser = require("body-parser"); 
const cors = require("cors"); 
const handlebars = require("express-handlebars"); 
const app = express(); 
const passport = require('passport'); 
const cookieParser = require("cookie-parser"); 

const config = require("./config/data"); 
const routes = require("./routes/users"); 
const company = require("./routes/company"); 
const person = require("./routes/person"); 
mongoose.Promise = global.Promise; 

let options = { 
    useMongoClient: true, 
    reconnectTries: Number.MAX_VALUE, 
    reconnectInterval: 500, 
    poolSize: 10, 
    bufferMaxEntries: 0 
    }; 

mongoose.connect(config.database,options); 

let db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
console.log(`DB connected ${new Date()}...`); 
}); 


//app.set('views',__dirname+'views'); 
app.engine('handlebars', handlebars({defaultLayout:false})); 
app.set('view engine', 'handlebars'); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 

app.use(express.static(__dirname + '/public')); 

// app.use(cors()); 
app.use(cookieParser()); 

// Passport Middleware 
// require('./config/passport')(passport); 
app.use(passport.initialize()); 

app.use(passport.session()); 


app.get("/",(req,res)=>{ 
    res.render("index"); 
}); 

// app.get("/forgotPass",(req,res)=>{ 
//  res.render("forgotPass"); 
// }); 
app.get("/user", (req,res)=>{ 
    res.render("user"); 
}); 

app.get("/login",(req,res)=>{ 
    res.render("login"); 
}); 
app.get("/signup",(req,res)=>{ 
    res.render("signup"); 
}); 
app.get("/we",(req,res)=>{ 
    res.render("we"); 
}); 
app.get("/blog",(req,res)=>{ 
    res.render("blog"); 
}); 
app.get("/contactUs",(req,res)=>{ 
    res.render("contactUs"); 
}); 
app.get("/userAsApplicant",(req,res)=>{ 
    res.render("userAsApplicant"); 
}); 
app.use("/users",routes); 
app.use("/company",company); 
app.use("/person",person); 
app.get("/faq",(req,res)=>{ 
    res.render("faq"); 
}); 
app.listen(config.port,()=>{ 
    console.log(`Server running on port ${config.port}....`); 
}); 

對於很多表單處理程序,我對所有請求都使用Ajax。

$(function() { 
    $('.subForm').on('submit', function (e) { 
     $.ajax({ 
      type: 'post', 
      url: 'http://localhost:3000/users/spec/register', 
      data: $(this).serialize(), 
      success:function(data){ 
       if(data.success){ 
        location.href="http://localhost:3000/login" 
       }else{ 
        location.href="http://localhost:3000/signup" 
       } 
      } 
     }); 
     e.preventDefault(); 
    }); 

     $('.personAuth').on('submit', function (e) { 
      $.ajax({ 
       type: 'post', 
       url: 'http://localhost:3000/person/register', 
       data: $(this).serialize(), 
       success:function(data){ 
        if(data.success){ 
         location.href="http://localhost:3000/login" 
        }else{ 
         console.log("Chexav"); 
         location.href="http://localhost:3000/signup"; 

        } 
       } 
      }); 
      e.preventDefault(); 
     }); 
     $('.companyAuth').on('submit', function (e) { 
      $.ajax({ 
       type: 'post', 
       url: 'http://localhost:3000/company/register', 
       data: $(this).serialize(), 
       success:function(data){ 
        if(data.success){ 
         location.href="http://localhost:3000/login" 
        }else{ 
         location.href="http://localhost:3000/signup" 
        } 
       } 
      }); 
      e.preventDefault(); 
     }); 
     $('.logInForm').on('submit', function (e) { 
      $.ajax({ 
       type: 'post', 
       url: 'http://localhost:3000/users/authenticate', 
       data: $(this).serialize(), 
       success:function(data){ 
        console.log(data); 
        if(data.token){ 
         localStorage.setItem("Authorization",data.token); 
         $.ajax({ 
          type:'get', 
          url:'http://localhost:3000/users/user', 
          beforeSend: function(xhr){xhr.setRequestHeader('auth', localStorage.getItem("Authorization"));}, 
          success:location.href="http://localhost:3000/users/user" 
         }) 
        } 
       }  
      }); 
      e.preventDefault(); 
     }); 

    }); 

而這條路由用於驗證。

const express = require("express"); 
const router = express.Router(); 
const Spec = require("../models/specialist"); 
const jwt = require("jsonwebtoken"); 
const config = require("../config/data"); 
const Model = require("../models/model"); 

    //Registration route 
    router.post("/spec/register",(req,res)=>{ 
     let date=new Date(); 
     let newUser = new Spec({ 
      name:req.body.spec_name, 
      email_num:req.body.spec_email, 
      password:req.body.spec_password, 
      role:"Specialist-User", 
      isActive:true, 
      created:date, 
      updatedToken:"JWT" 

     }); 
     if(newUser.password===req.body.spec_confirmPass){ 
      Spec.getUser(newUser.email_num,(error,user)=>{ 
       if(error) throw error; 
       if(!user){ 
        Spec.addUser(newUser,(err,user)=>{ 
         if(err){ 
          console.log("err"); 
          res.json({success:false,msg:"Somethings Went Wrong"}); 
         } else { 
          res.header("Content-Type","application/json"); 
          res.json({success:true,msg:"User Registered"}); 
         // res.redirect("/login"); 
         } 
        }); 
       }else{ 
        res.json({success:false,msg:"User Already Exists"}); 
       } 
      }); 
     }else{ 
      res.json({success:false,msg:"Password Not Confirmed"}); 
     } 
    }); 


    //Authentication route 
router.post('/authenticate', (req, res,next) => { 
     const email = req.body.email; 
     const password = req.body.password; 
     console.log("UserData"); 
     Model.findUser(email, (err, user) => { 
      console.log("UserData1"); 
      if(err) throw err; 
      if(!user){ 
      return res.json({success: false, msg: 'User not found'}); 
      } 
      Model.comparePassword(password, user.password, (err, isMatch) => { 
      console.log("UserData2"); 
      if(err) throw err; 
      if(isMatch){ 
       let payload={ 
       name:user.name, 
       email:user.email_num, 
       role:user.role, 
       deleted:user.deleted, 
       isActive:user.isActive, 
       created:user.created, 
       }; 
       let token = jwt.sign(payload,config.JWT_SECRET,{ 
        expiresIn:1440 
       }); 

       Model.saveToken(email,user.role,token,(err,success)=>{ 
        if(err) return err; 
        console.log("Success"); 
        // res.setHeader('Authorization',token); 
        // res.cookie('Authorization',token); 
        res.json ({ success: true, token: token }); 
        // res.redirect("https://stackoverflow.com/users/user"); 
       }); 


      } else { 
       return res.json({success: false, msg: 'Wrong password'}); 
      } 
     }); 
    }); 
// res.redirect("/user"); 
}); 

router.use(function(req, res, next) { 
    console.log(req.headers); 
    let token = req.body.token || req.headers['auth'] || req.query.token || req.cookies.Authorization; 
    // console.log(token); 
     if (token) { 
     jwt.verify(token, config.JWT_SECRET, function(err, decoded) {  
      if (err) { 
       console.log(err); 
      return res.json({ success: false, message: 'Failed to authenticate token.' });  
      } else { 
      req.decoded = decoded;  
      next(); 
      res.render("user"); 
      } 
     }); 

     } else { 
     return res.status(403).json({ 
      success: false, 
      message: 'No token provided.' 
     }); 

     } 
    }); 

router.get("/user", (req,res)=>{ 
    res.render("user"); 
}); 




module.exports = router; 

作爲模板引擎我使用Handlebars.So與登記一切都好,但是當我試圖驗證服務器帶來

Error: Can't set headers after they are sent.

我知道我可以使用cookie,但我想遠離這一點。 對不起語言錯誤,感謝您的幫助。

沙发
0
0

Error: Can't set headers after they are sent.

這意味着您要向客戶端發送多個響應。

我想你只需要刪除您res.render("user");在最後中間件是這樣的:

router.use(function(req, res, next) { 
    console.log(req.headers); 
    let token = req.body.token || req.headers['auth'] || req.query.token || req.cookies.Authorization; 
    // console.log(token); 
     if (token) { 
     jwt.verify(token, config.JWT_SECRET, function(err, decoded) {  
      if (err) { 
       console.log(err); 
      return res.json({ success: false, message: 'Failed to authenticate token.' });  
      } else { 
      req.decoded = decoded; 
      // Go next and delete res 
      next(); 
      // res.render("user"); 
      } 
     }); 

     } else { 
     return res.status(403).json({ 
      success: false, 
      message: 'No token provided.' 
     }); 

     } 
    }); 

希望它能幫助。

+1

這些都是Ctrl + C和Ctrl + V的效果。非常感謝您的快速和有效的答案。))))))))我會檢查它是正確的。 –

0
votes
answers
7 views
+10

控制檯上出現意外的JavaScript輸出

0

我試圖運行一段Node.js代碼。這是代碼:控制檯上出現意外的JavaScript輸出

var fs = require("fs"); 
 
fs.readFile('input.txt', function(err, data) { 
 
    if (err) return console.error(err); 
 
    console.log(data.toString()); 
 
}); 
 

 
console.log("Program Ended"); 
 
var http = require("http"); 
 
http.createServer(function(request, response) { 
 

 
    // Send the HTTP header 
 
    // HTTP Status: 200 : OK 
 
    // Content Type: text/plain 
 
    response.writeHead(200, { 
 
    'Content-Type': 'text/plain' 
 
    }); 
 

 
    // Send the response body as "Hello World" 
 
    response.end('Hello World
'); 
 
}).listen(8081); 
 

 
// Console will print the message 
 
console.log('Server running at http://127.0.0.1:8081/');

當我跑在我的筆記本電腦上的Linux終端上,該input.txt的文件的內容出現在最後一行的「服務器運行」命令後, 。理想情況下,首先readfile命令輸出應該在那裏,不是嗎?

輸出出來如下:

計劃結束

服務器在運行....

(txt文件的內容)

+1

爲什麼要在那裏第一次,考慮'fs.readFile'是一個異步方法,不是順序是否正確? – Teemu

沙发
0
5

FS。 readFile()是一種異步方法,因此它可能會或可能不會在其他代碼完成之前完成,只是在完成時才完成。

退房readFileSync()

https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options

+0

雖然此鏈接可能有助於您對問題的回答,但您可以通過將鏈接的重要部分放入您的答案中來改善此答案,這可確保您的答案在鏈接被更改或刪除時仍然是答案:) – WhatsThePoint

0
votes
answers
7 views
+10

SQLITE 3安裝錯誤

1

我總是嘗試通過命令行安裝東西。我最近安裝了Node(最新版本,版本號爲9.20)。我正在嘗試安裝/設置GECKO進行汽車交易。它需要安裝SQLite3。我正在關注的方向設置壁虎從這個鏈接:SQLITE 3安裝錯誤

https://www.youtube.com/watch?v=R68IwVujju8

和我在一步就是,你在命令行中鍵入:NPM =安裝

然而,它開始下載後,一些文件達到幾個「ERR!」聲明和切斷。下面是輸出:

(PS我也只用「故宮安裝」,我已經使用「故宮安裝sqlite3的」試過,都是給中端同樣的錯誤嘗試

C:用戶 fable187 下載壁虎穩定壁虎穩定> NPM安裝sqlite3的

[email protected] install C:Usersfable187Downloadsgekko-stablegekko-stable ode_modulessqlite3 node-pre-gyp install --fallback-to-build

節點預GYP ERR試圖下載(403):https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v3.1.13/node-v59-win32-x64.tar.gz 節點預GYP ERR預建的二進制文件!找不到[email protected][email protected](node-v59 ABI)(回落到用node-gyp編譯的源代碼)

C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3>如果未定義npm_config_node_gyp(節點「C: Program Files nodejs node_modules npm bin node-gyp-bin .... node_modules node-gyp bin node-gyp.js「clean)else(node」「clean)

C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3>如果未定義npm_config_node_gyp(節點「C: Program Files nodejs node_modules npm bin node-gyp-bin .... node_modules node-gyp bin node-gyp.js」配置 - 下降到生成--module = C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 lib binding node-v59-win32-x64 node_sqlite3.node --module_name = node_sqlite3 --module_path = C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 lib binding node-v59-win32-x64 --msvs_version = 2017)else(node「」configure - fallback-to-build --module = C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 lib binding node-v59-win32-x64 node_sqlite3.node --module_name = node_sqlite3 --module_path = C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 lib binding node-v59-win32-x64 --msvs_version = 2017) gyp ERR!配置錯誤 gyp ERR!堆棧錯誤:找不到Python可執行文件「C: Users fable187 AppData Local Programs Python Python35 python.EXE」,您可以設置PYTHON env變量。 gyp ERR!在PythonFinder.failNoPython(C: Program Files nodejs node_modules npm node_modules node-gyp lib configure.js:483:19)上堆棧 gyp ERR!在PythonFinder中堆棧。 (C: Program Files nodejs node_modules npm node_modules node-gyp lib configure.js:508:16) gyp ERR!堆棧位於C: Program Files nodejs node_modules npm node_modules graceful-fs polyfills.js:284:29 gyp ERR!堆棧在FSReqWrap.oncomplete(fs.js:166:21) gyp ERR!系統Windows_NT 10.0.16299 gyp ERR!命令「C: Program Files nodejs node.exe」「C: Program Files nodejs node_modules npm node_modules node-gyp bin node-gyp.js」「configure」「--fallback-to 「--module = C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 lib binding node-v59-win32-x64 node_sqlite3.node」「--module_name = node_sqlite3「」--module_path = C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 lib binding node-v59-win32-x64「」--msvs_version = 2017「 gyp ERR ! cwd C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 gyp ERR! node -v v9.2.0 gyp ERR! node-gyp -v v3.6.2 gyp ERR!不好 node-pre-gyp ERR!生成錯誤 node-pre-gyp ERR!堆棧錯誤:無法執行'node-gyp.cmd configure - 下降生成--module = C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 lib binding node -v59-win32-x64 node_sqlite3.node --module_name = node_sqlite3 --module_path = C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 lib binding node-v59-win32- x64 --msvs_version = 2017'(1) node-pre-gyp ERR!堆棧在ChildProcess。 (C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 node_modules node-pre-gyp lib util compile.js:83:29) node-pre-gyp ERR!堆棧在ChildProcess.emit(events.js:159:13) node-pre-gyp ERR! stack at maybeClose(internal/child_process.js:943:16) node-pre-gyp ERR!堆棧在Process.ChildProcess._handle.onexit(internal/child_process.js:220:5) node-pre-gyp ERR!系統Windows_NT 10.0.16299 node-pre-gyp ERR!命令「C: Program Files nodejs node.exe」「C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 node_modules node-pre-gyp bin node-pre- gyp「」install「」 - fallback-to-build「 node-pre-gyp ERR! cwd C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 node-pre-gyp ERR! node -v v9.2.0 node-pre-gyp ERR! node-pre-gyp -v v0.6.38 node-pre-gyp ERR!不正確 未能執行'node-gyp.cmd configure - 下降到構建--module = C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 lib binding node -v59-win32-x64 node_sqlite3.node --module_name = node_sqlite3 --module_path = C: Users fable187 Downloads gekko-stable gekko-stable node_modules sqlite3 lib binding node-v59-win32- x64 --msvs_version = 2017'(1) npm ERR!代碼ELIFECYCLE npm ERR! errno 1 npm ERR! [email protected]安裝:node-pre-gyp install --fallback-to-build npm ERR!退出狀態1 npm ERR! npm ERR!在[email protected]安裝腳本失敗。 npm ERR!這可能不是npm的問題。上面可能還有其他日誌記錄輸出。

npm ERR!此運行的完整日誌可在以下位置找到: npm ERR! C: Users 用戶fable187 應用程序數據漫遊 NPM-cache_logs 2017-12-03T08_00_31_371Z-的debug.log

C: Users 用戶fable187 下載壁虎穩定壁虎穩定>

沙发
0
0

SQLITE3尚未與NodeJS V9.2.0兼容(查看問題:https://github.com/mapbox/node-sqlite3/issues/902)。

您需要將您的nodeJS版本降級到V8.9.3。

提示:要伊斯利更改節點版本,你可以用NVM的Windows https://github.com/coreybutler/nvm-windows

Python的問題:這是由於「故宮安裝」,這是試圖編譯(與Python)位於源節點-V59-Win32的x64.tar.gz。由於Python未在您的計算機上安裝,因此出現錯誤。

0
votes
answers
7 views
+10

貓鼬保存回調不起作用

1

我正在爲使用MongoDB後端存儲數據的簡單Web應用程序構建服務器。我實例使用新的貓鼬連接:貓鼬保存回調不起作用

mongoose.connect('mongodb://localhost:27017/callback-newsfeed-db') 

我的MongoDB的輸出似乎罰款:

2017-12-02T21:00:53.277-0800 I NETWORK [thread1] connection accepted from 127.0.0.1:52027 #86 (1 connection now open) 
2017-12-02T21:00:53.291-0800 I NETWORK [thread1] connection accepted from 127.0.0.1:52028 #87 (2 connections now open) 
2017-12-02T21:00:53.291-0800 I NETWORK [thread1] connection accepted from 127.0.0.1:52029 #88 (3 connections now open) 
2017-12-02T21:00:53.292-0800 I NETWORK [thread1] connection accepted from 127.0.0.1:52030 #89 (4 connections now open) 
2017-12-02T21:00:53.292-0800 I NETWORK [thread1] connection accepted from 127.0.0.1:52031 #90 (5 connections now open) 

我還定義了一個型號如下:

const postSchema = mongoose.Schema({ 
    api: String, 
    source: String, 
    title: String, 
    upvotes: Number 
}) 

const Post = mongoose.model('Post', postSchema) 

在我的服務器端點之一,我有以下代碼:

server.post('/posts', (request, response) => { 
    console.log("INSIDE POSTS POST") 
    const newapi = request.body.api 
    const newsource = request.body.source 
    const newtitle = request.body.title 

    if(!newapi){ 
    response.send(422, "MUST PROVIDE API TYPE") 
    return 
    }else if(!newsource){ 
    response.send(422, "MUST PROVIDE RESOURCE SOURCE") 
    return 
    }else if(!newtitle){ 
    response.send(422, "MUST PROVIDE RESOURCE TITLE") 
    return 
} 

// Add a new post 
    const newPost = new post.Post({ 
     api: newapi, 
     source: newsource, 
     title: newtitle, 
     upvotes: UPVOTE_DEFAULT 
    }) 
    console.log("ABOUT TO SAVE") 

    // Save to DB and send to client 
    newPost.save(error => { 
     console.log("SAVE ERROR ") 
     console.log(error) 
     if(error){ 
      console.log("ERROR IN NEWPOST") 
      throw error 
     }else{ 
      console.log("STATUS OK") 
      response.status(STATUS_OK) 
      response.set({'Content-type': 'application/json'}) 
      response.send(JSON.stringify(newPost)) 
     } 
     console.log("SAVE HAS COMPLETED") 
    }) 
    console.log("AFTER NEW POST") 
    }) 

現在,當我跑我的應用程序,我在控制檯看到以下的輸出:

INSIDE POSTS POST 
ABOUT TO SAVE 
AFTER NEW POST 

然而,出於某種原因(不論我等待多久)沒有newPost.save()回調以往似乎的一部分打電話。 MongoDB輸出並不表示明顯的錯誤,所以我有點失落。爲什麼會發生這種情況?

我對節點非常陌生,所以關於如何甚至去調試這個問題或思考可能的錯誤元兇的任何想法將不勝感激!

沙发
0
0
const newPost = new post.Post({ 

應該

const newPost = new Post({ 
+0

這不能提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/18136963) – Nisarg

+0

我已經在回調的每個分支中都有console.log語句,就像你上面看到的那樣,並且沒有任何一個被打印出來。 – MEric

+0

看到我的編輯,我想我找到了你的問題。 – Alan

板凳
0
0

您可以設置貓鼬使用ES6承諾。

mongoose.Promise = global.Promise; 
    mongoose.connect(process.env.MONGODB_URI); 

然後你可以使用

newPost.save().then(() => { 
    console.log('Everything went well'); 
    }).catch((e) => { 
    console.log('There was an error', e.message); 
    }); 
地板
0
0

原來,這個問題似乎一直的MongoDB和版本我是用貓鼬之間的不兼容。一旦我通過調用npm升級mongodb來升級我的mongodb版本,保存操作似乎已開始工作