.NET Core’da NodeServices ile Node.js Modüllerinin Kullanımı
Merhabalar;
Bu yazımda NodeServices ile Node.js modüllerinin kullanımını anlatacağım.
Yapacağımız örnekte bir html sayfasını PDF’e dönüştürmek için bir npm paketi olan phantomjs kullanacağız. phontomjs’nin tüm özelliklerini kullanmayacağız, sadece NodeServices ile nasıl çalışabileceğimizi anlamak adına pdf dönüşümünü öğreneceğiz.
Öncelikle çalışacağımız cihazda Node.js yüklü değil ise https://nodejs.org sitesinden gerekli adımları takip ederek kurulumu gerçekleştiriyoruz.
Bir ASP.NET Core uygulaması oluşturarak devam ediyoruz, uygulamayı oluşturduktan sonra uygulama klasörünün içerisine aşağıdaki verilerin bulunduğu bir package.json dosyası oluşturuyoruz, bu bize gerekli paketlerin yüklenmesi için lazım olacak.
package.json
{
"version": "1.0.0",
"name": "exp.pdfgen",
"private": true,
"dependencies": {
"html-pdf": "^2.2.0"
}
}
json oluşturulduktan sonra bir komut penceresi açarak proje dizinimize gidiyor ve aşağıdaki komutu çalıştırıyoruz.
Gerekli kurulumlar tamamlandıktan sonra projemize generatePDF.js isminde bir JavaScript dosyası ekliyoruz. Bu html sayfamızı okumayacak npm paketimizi kullanarak pdf dosyasına dönüştürme işlemini yapacaktır.
generatePDF.js
module.exports = function (callback, inputFilePath, outputFilePath) {
//callback : This is node style callback, since the NodeServices invokes the javascript Asynchronously
//inputFilePath : The html file path
//outputFilePath : The file path where the pdf is to be generated
var fs = require('fs'); // get the FileSystem module, provided by the node envrionment
var pdf = require('html-pdf'); // get the html-pdf module which we have added in the dependency and downloaded.
var html = fs.readFileSync(inputFilePath, 'utf8'); //read the contents of the html file, from the path
var options = { format: 'Letter' }; //options provided to html-pdf module. More can be explored in the module documentation
//create the pdf file
pdf.create(html, options).toFile(outputFilePath, function (err, res) {
if (err) return callback(null, "Failed to generate PDF");
callback(null, "Generated PDF Successfully");
});
}
Projemize NodeServices nuget paketini ekliyoruz;
Daha sonra Program.cs dosyamızın içeriğini aşağıdaki gibi kodluyoruz;
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.NodeServices;
using Microsoft.Extensions.DependencyInjection;
namespace NodeServiceSample
{
class Program
{
static void Main(string[] args)
{
//Instantiate DI container for the application
var serviceCollection = new ServiceCollection();
//Register NodeServices
serviceCollection.AddNodeServices();
//Request the DI container to supply the shared INodeServices instance
var serviceProvider = serviceCollection.BuildServiceProvider();
var nodeService = serviceProvider.GetRequiredService<INodeServices>();
//Input file path of html file
var inputFilePath = "C:\\Users\\auysa\\source\\repos\\NodeServicesSample\\NodeServices_Sample\\sample.html";
//Output file path of pdf file
var outputFilePath = "C:\\Users\\auysa\\source\\repos\\NodeServicesSample\\NodeServices_Sample\\sampleOutput.pdf";
var taskResult = GeneratePdf(nodeService, inputFilePath, outputFilePath);
Task.WaitAll(taskResult);
if (taskResult.IsCompletedSuccessfully)
{
Console.WriteLine(taskResult.Result);
}
Console.ReadKey();
}
private static async Task<string> GeneratePdf(INodeServices nodeService, string inputFilePath, string outputFilePath)
{
//Invoke the javascript module with parameters to execute in Node environment.
return await nodeService.InvokeAsync<string>(@"C:\\Users\\auysa\\source\\repos\\NodeServicesSample\\NodeServices_Sample\\generatePDF.js", inputFilePath, outputFilePath);
}
}
}
Daha sonra projeye sample.html dosyası ekliyoruz, içeriği aşağıdaki gibi olacaktır.
<html>
<body>
<p>Örnek Metin</p>
<p style="font:20px;color:magenta;">Örnek Metin</p>
</body>
</html>
Uygulamayı çalıştırdığızda pdf dosyası oluşacaktır.
İyi günler kolay gelsin, Bir mvc projemin içerisinde node.js entegre ettim projem local’da sağlıklı bir şekilde çalışırken ortak bir sunucuya kurduğumda node.js ile çalışan kodlarımdan hata alıyorum. Projeyi publish ederken node.js ile ilgili ekstra yapmam gereken bir durum var mı? Zira projeyi publish ettikten sonra publish ettiğim klasörün içerisinde node_modules klasörüm ya da node.js ile ilgili klasörlerimi göremedim. Şimdiden teşekkür ederim.