2016-07-19 6 views
3

Ich verwende das gulp und Paket auf node.js, um einige Nur-Text-Dateien zu überführen. Unter Unix scheint alles gut zu funktionieren. Einige Mitarbeiter haben jedoch Probleme bei der Ausführung unter Windows. Sie werden immer folgende Fehlermeldung nur dann, wenn unter Windows ausgeführt wird:Node.js - Eigenschaft 'toString' von Null kann nicht gelesen werden, wenn Paket unter Windows ausgeführt wird

[13:02:01] TypeError: Cannot read property 'toString' of null at Object.transcludeStringSync (D:\project\node_modules\hercule\lib\hercule.js:136:36) 

habe ich versucht, die oben mit [email protected] sowie [email protected], und beide Pakete geben den obigen Fehler. Da dies jedoch nur unter Windows und über viele Versionen des Pakets auftritt, vermute ich, dass das Problem mit der Node.js-Installation oder dem Pfad etwas zu tun hat.

Der Code, der die Paket verwendet:

var fs = require('fs'); 
var path = require('path'); 
var gulp = require('gulp'); 
var drakov = require('drakov'); 
var hercule = require('hercule'); 

gulp.task('mock', ['i18n','build_minify_no_tests'], function() { 
    var mockSpecificationTemplate= fs.readFileSync('test/mock/mock-template.apib','utf8'); 
    var transcludedMockSpecification = hercule.transcludeStringSync(mockSpecificationTemplate, { 
     relativePath: path.resolve('../../../') 
    }); 
    fs.writeFileSync('test/mock/mock.apib', transcludedMockSpecification, 'utf-8'); 

    // Running mock server 
    var drakovArgv = { 
     sourceFiles: 'test/mock/mock.apib', 
     serverPort: 9000, 
     staticPaths: [ 
      '../../' 
     ], 
     discover: true, 
     watch: true 
    }; 
    drakov.run(drakovArgv); 
}); 

node und npm Versionsinformationen:

$ node -v 
v6.3.0 
$ npm -v 
3.10.3 
+0

Lassen Sie Ihre Mitarbeiter, Linux zu verwenden? – mash

+1

Das Problem ist wahrscheinlich, dass 'transcludeStringSync' versuchen wird, einen anderen Knotenprozess unter Verwendung von' child_process' zu erzeugen, der wahrscheinlich aufgrund des Weges oder der Argumente, die es wissen, unter Windows scheitern wird. Wie auch immer, es ist eine schlechte Übung, stattdessen transcludeString zu verwenden und es sollte behoben werden. – mash

+2

Es wird versucht, den Dateiinhalt in String() zu konvertieren. aber es wird NULL, daher ist das Problem, dass der Dateipfad nichts zurückgibt. Können Sie test/mock/mock-template.apib Inhalt anzeigen? Ich glaube, etwas stimmt nicht mit den Pfaden dort (von Linux zu Windows) der relative Pfad + diese Pfade sind nicht richtig konfiguriert. – Bamieh

Antwort

1

hercule.transcludeStringSync einfach läuft eine weitere Prozess und sendet eingegeben es:

const result = childProcess.spawnSync('../bin/hercule', syncArgs, syncOptions); 

mit dem Skript ../bin/hercule:

#!/usr/bin/env node 

"use strict"; 

require('../lib/main.js'); 

... funktioniert offensichtlich nicht auf Windows

Wenn diese Aufgabe synchronisiert werden müssen, können Sie die folgende Funktion stattdessen verwenden können:

function transcludeStringSync(input, options) { 
    const {dirname, join} = require('path') 
    const hercule = join(dirname(require.resolve('hercule')), 'main') 
    const args = [hercule, '--reporter', 'json-err'] 
    for (let name in options) { 
    args.push(`--${name}`, `--${options[name]}`) 
    } 
    const result = require('child_process').spawnSync('node', args, {input}) 
    const err = result.stderr.toString() 
    if (err) throw new Error('Could not transclude input') 

    return result.stdout.toString() 
} 
+0

Dieses (und eine Kombination von Windows-Zeilenenden) löste das Problem. Akzeptiert. – LanceLafontaine

Verwandte Themen